我试图通过在配置类中使用Spring @Bean来解除现有Spring应用程序中的依赖项,并在使用它的类中使用@Autowired。
以下是主要配置类:
@Configuration
@ComponentScan(basePackages = {"com.example"})
@EnableWebMvc
public class DataLoadConfig extends WebMvcConfigurerAdapter {
@Bean
ActivitiesFeed activityFeed() {
HashMap temp = new HashMap();
return new ActivitiesFeed(temp);
}
...
以下是依赖项的使用方式:
public class ActivitiesLoad {
// ADDED
@Autowired
ActivitiesFeed activityFeed;
public ActivitiesLoad(String loadType, int personCode, String outputFilter, int outputNumber) {
...
// REMOVED - this approach didn't throw any errors though
// HashMap temp = new HashMap();
// ActivitiesFeed activityFeed = new ActivitiesFeed(temp);
// This dependency is now @Autowired in
feed = activityFeed.getActivities();
...
但是,我现在收到以下错误:
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/DataLoads] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at ac.uk.strath.t4.dataload.pure.activities.ActivitiesLoad.(ActivitiesLoad.java:66)
at ac.uk.strath.t4.dataload.controller.DataLoadController.pureActivities(DataLoadController.java:149)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
...
看到原始的初始化代码,这个运行没有任何问题,所以我知道依赖项工作,但想知道我是否已经实现了错误的注入。
顺便说一句,我不拥有ActivitiesFeed源代码,所以我不能将类似注释的@Components附加到类中,所以选择将它作为@Bean放入app配置类(DataLoadConfig)。
注意:我也尝试将ActivitiesLoad构造函数代码放入run(...)方法,只是包装它是一个问题,我试图从构造函数中访问依赖项,但它只是给了我相同的错误。 理想情况下,我宁愿将代码保留在构造函数中,因为它是别人的代码,并且不希望在此阶段破坏太多的风险:)
UPDATE
我试图添加一个@PostConstruct方法但只是同样的问题。 然后我将activityFeed属性设为私有,就像我在示例中看到的那样,但是相同。
public class ActivitiesLoad {
@Autowired
private ActivitiesFeed activityFeed;
private String loadType;
private int personCode;
private String outputFilter;
private int outputNumber;
public ActivitiesLoad(String loadType, int personCode, String outputFilter, int outputNumber) {
log.debug("Starting pure activities data load");
this.loadType = loadType;
this.personCode = personCode;
this.outputFilter = outputFilter;
this.outputNumber = outputNumber;
}
@PostConstruct
public void init() {
log.debug("Starting pure activities data load @PostConstruct");
log.debug(activityFeed); // outputs: null
...
更新2
在这里,我将依赖项从构造函数中移除,而是将其放入自己的init方法中,并在创建ActivityLoad实例后调用它。 但是,我仍然看到NullPointerException的问题。
ActivityLoad的实例化(现在使用在创建实例后调用的init方法):
...
ActivitiesLoad activitiesLoad = new ActivitiesLoad();
activitiesLoad.init(loadType, personCode, typeFilter, outputLimit);
...
这是包含新方法的ActivityLoad类
@Component
public class ActivitiesLoad {
@Autowired
private ActivitiesFeed activityFeed;
public void init(String loadType, int personCode, String outputFilter, int outputNumber) {
log.debug(activityFeed); // outputs: null