我正在使用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构造函数会打印出从application.properties读取的正确url / user / pwd。但是,ElasticServerConfig的实例未注入Search对象:
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
}
}
答案 0 :(得分:2)
您必须将Search类注册为Spring Bean,并在要使用它时从Spring上下文中获取它。从spring语境中获取bean非常重要。如果使用public class MyGsonConverter extends GsonConverter {
@Override
public Object fromBody(TypedInput body, Type type) throws ConversionException {
Object obj = super.fromBody(body, type);
if (obj instanceof User) {
((User)obj).init();
}
return obj;
}
}
创建该类的对象,Spring无法知道该类并使其依赖。
你可以通过new
从某个地方获取一个来自Spring上下文的bean,或者通过访问上下文的实例并使用@Autowire
方法:
getBean
在类上使用@Component注释并确保该类位于@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(AppConfig.class, args);
ctx.getBean...
}
}
或在配置类
中注册my.package