自动装配的组件为空

时间:2016-01-25 09:01:54

标签: java spring properties autowired

我正在使用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
    }
}

1 个答案:

答案 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