首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动配置组件为空。

自动配置组件为空。
EN

Stack Overflow用户
提问于 2016-01-25 09:01:54
回答 1查看 3.1K关注 0票数 1

我正在用spring开发一个web应用程序。我在自动安装和使用数据库@Service类方面没有问题。现在,我正在尝试读取一个全局属性文件,并向所有需要它们的类提供值。到目前为止,我想出的解决方案似乎过于复杂(有太多的类-- AppConfig、ServerConfig iface、ElasticServerConfig)来完成这样一项琐碎的任务,但如果它成功的话,我可以接受。

我的applicationContext.xml包含

代码语言:javascript
运行
复制
<context:component-scan base-package="my.package" />

AppConfig.java:

代码语言:javascript
运行
复制
package my.package.configuration;

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {

}

ServerConfig.java:

代码语言:javascript
运行
复制
public interface ServerConfig {
    String getUrl();
    String getUser();
    String getPassword();
}

ElasticSearchConfig.java:

代码语言:javascript
运行
复制
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的实例注入搜索对象:

代码语言:javascript
运行
复制
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
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-25 09:13:10

您必须将搜索类注册为Spring,并在要使用它时从Spring上下文中获取它。从spring上下文中获取bean非常重要。如果使用new创建该类的对象,则Spring无法了解该类并管理它的依赖关系。

您可以通过@Autowire从Spring获取bean,或者访问上下文的实例,并使用getBean方法:

代码语言:javascript
运行
复制
@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下面的包中

或者在配置类中注册它。

代码语言:javascript
运行
复制
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
    @Bean
    public Search search(){
        return new Search();
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34988572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档