需求:在Action中启动一个Thread去做一件事,因项目是通过spring的自动注入的Bean之前的依赖关系,在线程中的Service引用始 终无法得到对象,即使是new出来的,可Service中的Dao引用又是null的,可以通过在Action中创建Thread的时候把Action中 的service引用作为构造参数传递给Thread,这样Thread中的Service对象就是通过SPring的自动注入得到的了。
public class P4PInvoiceImportThread extends Thread {
……
private IBizNormalInvoiceService bizNormalInvoiceService;
private IBizP4PInvoiceService bizP4PInvoiceService;
private IBatchExportFileManager batchExportFileManager;
public P4PInvoiceImportThread(Long invoiceType, File file, String nick,
boolean isNotifySeller) {
this.bizNormalInvoiceService = (IBizNormalInvoiceService) BeanManager
.getBean("bizNormalInvoiceService");
this.bizP4PInvoiceService = (IBizP4PInvoiceService) BeanManager
.getBean("bizP4PInvoiceService");
this.batchExportFileManager = (IBatchExportFileManager) BeanManager
.getBean("batchExportFileManager");
}
……
}
2.真实的服务对象[$Proxy84]没有实现指定接口
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'p4pInvoiceServiceHsf' defined in URL [file:/home/admin/hjbill/.default/deploy/hjbill.war/WEB-INF/classes/config/hsf/billserver-hsf.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 真实的服务对象[$Proxy84]没有实现指定接口[com.taobao.huijin.bill.client.IP4PinvoiceService].
已有实现类,难道没有被扫描到吗?查看application-context.xml发现,已在扫描包路径内。
后来师兄过来帮忙查找原因,发现,bean名称与引用业务方提供的HSF服务同名了!!
妈蛋,竟然花了我的2个小时的时间去处理,看来分析问题的能力还是太弱了,有时问题发生不能仅看表面出错点,特别是check几遍之后,不要死扣着‘代码明明没问题啊,这不是我的问题啊。。X*()*&&*(’ 这只是将自己向死胡同引导。这时候更需要自己跳出这种想法,换另外一种思路:检查相关代码,特别是新创建spring的bean,对于业务上通常使用的词汇,要特别留心,不同与已有的重复。当然这个时候千万别被异常信息定位框死了。
在原有类似业务上做二次开发,缺少自己去写DAO,service的机会,碰到问题学习到的东西远多于照搬原有配置,所以每积累一次,都需要用心好好消化吸收。