Spring MVC @ Value / @ ConfigurationProperties在MainConfig上起作用,但在SecurityConfig上不起作用

时间:2019-04-18 15:12:38

标签: spring spring-mvc spring-security properties autowired

我有一个简单的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 :(得分:0)

来自有关@PropertySource的官方文档:

和@Value批注中解析$ {...}占位符

  

为了使用PropertySource中的属性解析定义或@Value批注中的$ {...}占位符,必须确保在ApplicationContext使用的BeanFactory中注册了适当的嵌入式值解析器。在XML中使用时会自动发生。使用@Configuration类时,可以通过通过静态@Bean方法显式注册PropertySourcesPlaceholderConfigurer来实现。但是请注意,通常仅在需要自定义配置(例如占位符语法等)时,才需要通过静态@Bean方法显式注册PropertySourcesPlaceholderConfigurer。请参阅@Configuration的javadocs的“使用外部化的值”部分和“有关详细信息和示例,请注意@Bean的javadocs的BeanFactoryPostProcessor-returning @Bean方法”。

您应该尝试将注释 @PropertySource 添加到您的配置类中。

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

,然后尝试访问 SecurityConfig

中的属性

要获取完整的信息,请参见official docs

我希望它将对您有帮助

答案 1 :(得分:0)

这对我有用。 我猜你还有另一个触发应用程序的类,并用@SpringBootApplication注释 另外,您的方法mySpecialBean不会返回MySpecialBean实例,因此它甚至可能无法编译。 您是否正在使用其他任何类?请咨询

答案 2 :(得分:0)

终于明白了! 该问题与某些依赖项优先级和不必要的Bean声明有关。详细介绍,我正在使用OAuht2,并且我从this tutorial开始。最后,我也混用了this one(最近)。问题与这些@Bean确实相关,实际上并不需要将它们声明为bean:

  • ClientRegistrationRepository
  • ClientRegistration
  • OAuth2AuthorizedClientService

Spring在进行任何其他配置之前先调用了这些bean,因此尚未加载任何属性。也许更改优先级,依赖性甚至顺序都可以解决问题,但是当我分析代码时,我发现这些方法仅用于安全性配置,而在应用程序的任何其他部分中并不需要。所以我删除了@Bean声明,现在一切正常!在安全配置内部调用这些方法时,属性已经加载。

希望可以帮助某个人。