项目基于spring和mybatis等。
需求:从一堆不同格式的文件中将数据解析出来。因为文件格式不同,所以解析方式也不同。
解决:
最开始的想法,用工厂设计模式。
首先定义一个工厂接口ReadFileFactory
。再定义一个执行类ReadFile。不同类型的文件类都继承ReadFile接口。再由相应的工厂类创建实例对象。以便于扩展。
问题的出现:
以下是我的测试类
@ActiveProfiles("dev")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/appContext.xml","classpath:spring/appContext-datasource.xml"})
@Transactional
public class ReadReconciliationFileTest {
@Autowired
private OriginalReconciliationInformationExtMapper originalReconciliationInformationExtMapper;
@Autowired
private ProblematicReconciliationInformationMapper problematicReconciliationInformationMapper;
@Test
public void insertReconciliationInformation(){
ReadReconciliationFileFactory readFactory=new AllinReadReconciliationFileFactory();
ReadReconciliationFile read=readFactory.produce();
List<ReconciliationBean> list=read.readFile("/Users/*******/20170216.txt");
for(int i=0;list!=null&&i<list.size();i++){
originalReconciliationInformationExtMapper.insertInformation(list.get(i));
}
List<ReconciliationBean> list2=originalReconciliationInformationExtMapper.getInformationList(null);
List<String> list3=problematicReconciliationInformationMapper.getProblematicDataList("9",null);
Assert.assertEquals(list.size(),list2.size()+list3.size());
}
}
运行时出现了空指针异常,空的地方如下:
依赖注入并没有起效果,但是在测试类中却是起了作用的。
原因:
问题出在这两行代码
ReadReconciliationFileFactory readFactory=new AllinReadReconciliationFileFactory(); ReadReconciliationFile read=readFactory.produce();
对于创建的AllinReadReconciliationFileImpl对象,spring一无所知,所以它无法autowire。
解决:
将上面两行去掉,由spring 去创建AllinReadReconciliationFileImpl对象。