我正在用spring开发一个web应用程序。我在自动安装和使用数据库@Service类方面没有问题。现在,我正在尝试读取一个全局属性文件,并向所有需要它们的类提供值。到目前为止,我想出的解决方案似乎过于复杂(有太多的类-- AppConfig、ServerConfig iface、ElasticServerConfig)来完成这样一项琐碎的任务,但如果它成功的话,我可以接受。
我的applicationContext.xml包含
<context:component-scan base-package="my.package" />AppConfig.java:
package my.package.configuration;
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
}ServerConfig.java:
public interface ServerConfig {
String getUrl();
String getUser();
String getPassword();
}ElasticSearchConfig.java:
package my.package.configuration;
@Component(value = "elasticServerConfig")
public class ElasticServerConfig implements ServerConfig {
private static final Logger LOGGER = LogManager.getLogger(ElasticServerConfig.class);
private String url;
private String user;
private String password;
@Autowired
public ElasticServerConfig(final Environment env) {
this.url = env.getProperty("elastic_server.url");
this.user = env.getProperty("elastic_server.user");
this.password = env.getProperty("elastic_server.password");
LOGGER.debug("url=" + url + "; user=" + user + "; password=" + password); // this works!
}
@Override
public final String getUrl() {
return url;
}
@Override
public final String getUser() {
return user;
}
@Override
public final String getPassword() {
return password;
}
}当web应用程序启动时,ElasticServerConfig构造函数打印出正确的url/user/pwd,从application.properties读取。但是,没有将ElasticServerConfig的实例注入搜索对象:
package my.package.util;
public class Search {
@Autowired
@Qualifier("elasticServerConfig")
private ServerConfig elasticServerConfig;
public final List<Foobar> findByPatternAndLocation() {
if (elasticServerConfig == null) {
LOGGER.error("elasticServerConfig is null!");
}
// and i get a NullPointerException further on
// snip
}
}发布于 2016-01-25 09:13:10
您必须将搜索类注册为Spring,并在要使用它时从Spring上下文中获取它。从spring上下文中获取bean非常重要。如果使用new创建该类的对象,则Spring无法了解该类并管理它的依赖关系。
您可以通过@Autowire从Spring获取bean,或者访问上下文的实例,并使用getBean方法:
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(AppConfig.class, args);
ctx.getBean...
}
}或者在类上使用@Component注释,并确保类在my.package下面的包中
或者在配置类中注册它。
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
@Bean
public Search search(){
return new Search();
}
}https://stackoverflow.com/questions/34988572
复制相似问题