我知道这个特定的问题有很多答案,而且我知道可能会发生各种情况。
但是我想我错了,鉴于我的情况,我不知道所有可能的组合。
让我分享代码片段,以便代码可以说明一切。
控制器类
@RestController
public class ReportController {
@Autowired
ReportFactory reportFactory;
//RequestMapping goes here!
public ResponseEntity<Report> getReport() {
ReportGenerator<?> reportGenerator = reportFactory.getReportGenerator("order"); //line# 43
return getSuccessResponse(reportGenerator.getReport(companyGUID, startDate, endDate)); //geting the exception here saying reportGenerator is null!
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private <T> ResponseEntity getSuccessResponse(T response) {
return new ResponseEntity(response, HttpStatus.OK);
}
}
我在第43行找到了
reportGenerator
,将我带到ReportFactory
,正如您所看到的,应该自动接线。ReportFactory.java
@Component
public class ReportFactory {
@Autowired
Map<String, ReportGenerator> reportList;
public ReportGenerator<?> getReportGenerator(String reportType) {
return reportList.get(reportType.toLowerCase());
}
}
如您所见,该类用
Component
注释,并且具有reportList
的另一个依赖关系,该bean来自以下类。ReportGeneratorConfig.java
@Configuration
public class ReportGeneratorConfig {
@Autowired
BeanFactory factory;
@Bean
public Map<String, ReportGenerator> reportList() {
HashMap<String, ReportGenerator> reportList = new HashMap<String, ReportGenerator>();
reportList.put("order", factory.getBean(OrderReportGeneratorImpl.class));
//OrderReportGeneratorImpl implements ReportGenerator
return reportList; //created the bean which should be autowired wherever needed!
}
}
当我在调试中运行代码时,我可以看到
config
类实际上是在创建bean并将其自动装配到ReportFactory
中。但是,相同的
ReportFactory
bean不会自动连接到控制器类。在所有bean初始化完成之后,最重要的是,当我检查调试值时,
reportFactory
实例在reportlist
的controller
实例中具有空值。但是
reportlist
有两个完全不同的条目,在reportFactory
类中从未提及过。有了这些,请在这里帮助我!
附言这是一个webapp,我正在使用springBoot。
最佳答案
对于以后可能会访问此文件的人。
如Mallikarjun所建议,以下更改对我有所帮助。ReportFactory.java
@Component
public class ReportFactory {
@Resource // It was autowired here
Map<String, ReportGenerator> reportList;
public ReportGenerator<?> getReportGenerator(String reportType) {
return reportList.get(reportType.toLowerCase());
}
}