Spring MVC @ Value / @ ConfigurationProperties, работающий с MainConfig, но не с SecurityConfig - PullRequest
1 голос
/ 18 апреля 2019

У меня есть простой проект Spring MVC 5 с включенным уровнем безопасности.Все работает хорошо, кроме загрузки свойств, только в Security Config.Я предоставил вам сценарий, чтобы вы могли его увидеть.

application.properties (находится в src / main / resources)

com.company.myapp.prop=myprop

MainConfig.java

@Configuration
public class MainConfig implements WebMvcConfigurer {

    @Value("${com.company.myapp.prop}")
    private String prop;

    @Bean
    public MySpecialBean mySpecialBean() {
        System.out.println(prop); // output > myprop
        return new MySpecialBean();
    }
}

SecurityConfig.java

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${com.company.myapp.prop}")
    private String prop;

    @Bean
    public MySpecialSecurityBean mySpecialSecurityBean() {
        System.out.println(prop); // output > null
        return new MySpecialSecurityBean();
    }
}

Я не понимаю, почему это происходит.Я уже переключил аннотацию @EnableWebSecurity на класс приложения, попытался установить PropertySourcesPlaceholderConfigurer самостоятельно, но ничего не работает.Ты хоть представляешь, что происходит?

Ответы [ 3 ]

0 голосов
/ 18 апреля 2019

Это работает для меня. Я предполагаю, что у вас есть другой класс, который запускает приложение и который аннотируется @SpringBootApplication Кроме того, ваши методы mySpecialBean не возвращают экземпляр MySpecialBean, так что это, вероятно, даже не компилируется. Есть ли другой класс, который вы используете? Пожалуйста, совет

0 голосов
/ 20 апреля 2019

Наконец-то понял! Проблема была связана с некоторыми приоритетами зависимости и объявлениями ненужных бинов. Что касается деталей, я работаю с OAuht2 и начал с этого урока . В конце концов я сделал микс с и этим (более поздний). Проблема была связана с этими @ Bean's, которые на самом деле не нужно объявлять как bean:

  • ClientRegistrationRepository
  • ClientRegistration
  • OAuth2AuthorizedClientService

Spring вызывал эти bean-компоненты до любой другой конфигурации, поэтому никакие свойства еще не были загружены. Возможно, изменение приоритета, зависимости или даже порядка решит проблему, но, анализируя код, я обнаружил, что эти методы используются только для настройки безопасности и не нужны в какой-либо другой части приложения. Поэтому я удалил объявление @Bean, и теперь все работает хорошо! В то время, когда эти методы вызываются в конфигурации безопасности, свойства уже загружены.

Надеюсь помочь кому-нибудь там.

0 голосов
/ 18 апреля 2019

Из официальных документов о @PropertySource:

Разрешение $ {...} заполнителей в и @Value аннотациях

Для того, чтобыРазрешите заполнители $ {...} в определениях или аннотациях @Value, используя свойства из PropertySource, вы должны убедиться, что соответствующий преобразователь встроенных значений зарегистрирован в BeanFactory, используемом ApplicationContext.Это происходит автоматически при использовании в XML.При использовании классов @Configuration это может быть достигнуто путем явной регистрации PropertySourcesPlaceholderConfigurer с помощью статического метода @Bean.Однако обратите внимание, что явная регистрация PropertySourcesPlaceholderConfigurer с помощью статического метода @Bean обычно требуется только в том случае, если вам нужно настроить конфигурацию, такую ​​как синтаксис заполнителя и т. Д. См. Раздел «Работа с внешними значениями» в javadocs @ Configuration и «aобратите внимание на BeanFactoryPostProcessor, возвращающий методы @Bean "javadocs @ Bean для подробностей и примеров.

Вы должны попытаться добавить аннотацию @ PropertySource в ваш класс конфигурации.

@Configuration
@PropertySource("classpath:my.properties")
public class MainConfig implements WebMvcConfigurer {}

, а затем попытайтесь получить доступ к своей собственности в SecurityConfig class

Для получения полной информации см. официальные документы

Я надеюсь, что этопоможет вам

...