2016-01-28 2 views
0

У меня есть приложение загрузки весны (1.3.1.RELEASE) и недавно испытал странное поведение при попытке вставить в мою конфигурацию bean-компонент @ConfigurationProperties. Я не эксперт весной, поэтому мой вопрос: как объяснить это поведение?Spring: Ввод внешних свойств в java Конфигурации

Так установка такова:

MyApplication.java:

package me.developer; 

@SpringBootApplication 
public class MyApplication { 

    public static void main(final String... args) { 
     SpringApplication.run(<..>, args); 
    } 

} 

SecurityProperties.java:

package me.developer.document.security; 

@Setter 
@Getter 
@Component 
@ConfigurationProperties(prefix = "security") 
public class SecurityProperties { 
    private List<String> apiKeys = new ArrayList<>(); 
} 

SecurityConfiguration.java

package me.developer.document; 

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private SecurityProperties securityProperties; 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     <..> 
    } 

} 

При запуске приложения я получаю сообщение об ошибке, что весна не может впрыснуть SecurityConfiguration.securityProperties, потому что он ничего не знает о me.developer.document.security.SecurityProperties фасоли.

Но если переименовать SecurityProperties в SicurityProperties (вторая буква "е" -> "я") - это работает! Не спрашивайте меня, как я дошел до этого, но мне просто интересно, как это поведение можно объяснить? То есть с моей точки зрения он должен либо работать или нет, но не в зависимости от названия бобов, и т.д. ...

Update: Я также работаю, если я не касаюсь имени класса, но явно указать имя боба как что

package me.developer.document.security; 

@Setter 
@Getter 
@Component("securityProperties.my") 
@ConfigurationProperties(prefix = "security") 
public class SecurityProperties { 
    private List<String> apiKeys = new ArrayList<>(); 
} 

И я не предоставляю никаких дополнительных квалификаторов во время автопостановки ... Почему это происходит?

+0

имя компонента должно совпадать с именем класса, за исключением того, что оно обозначено строчной буквой для первой буквы. например bean 'securityProperties' соответствует классу' SecurityProperties'. у вас, вероятно, возникла некоторая опечатка – OPK

+0

Nope ( Проблема заключается в том, что имя класса не совпадает с именем bean. Ie 'private SicurityProperties securityProperties'. –

+0

У вас есть файл xml или файл свойств – OPK

ответ

0

Предполагая, что у вас есть зависимость от spring-boot-starter-security, Spring загрузки будет автоматически конфигурируемый свой собственный SecurityProperties боб, который также аннотированный с @ConfigurationProperties. К сожалению, этот bean-компонент будет иметь то же имя, что и ваш bean-компонент, поскольку имена классов (игнорируя пакет) одинаковы. Это столкновение имен означает, что Spring Boot будет переопределять ваш компонент свойств безопасности. Вы должны увидеть предупреждающее сообщение об этом, зарегистрированное во время запуска.

Как вы заметили, изменив имя вашего компонента, чтобы больше не было столкновения имени, оно решит проблему.

+0

Да, я, наконец, пришел к такому же решению ... Но с моей точки зрения, весна, возможно, была более многословной: вы не можете выучить наизусть все свои встроенные компоненты, чтобы избежать подобных ситуаций. С другой стороны, может быть хорошей идеей явно указать ваши уникальные имена фасоли, которые, безусловно, не могут столкнуться с весной. На всякий случай. –

Смежные вопросы