我有一个简单的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,但是没有任何效果。 你知道发生了什么吗?
答案 0 :(得分:0)
来自有关@PropertySource的官方文档:
在
为了使用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:
Spring在进行任何其他配置之前先调用了这些bean,因此尚未加载任何属性。也许更改优先级,依赖性甚至顺序都可以解决问题,但是当我分析代码时,我发现这些方法仅用于安全性配置,而在应用程序的任何其他部分中并不需要。所以我删除了@Bean声明,现在一切正常!在安全配置内部调用这些方法时,属性已经加载。
希望可以帮助某个人。