当前位置:首页 > 科技新闻 > Web编程 > 正文

继承timetask的类使用@Autowired注入为null,类加了@component构成方法参数报错
2021-10-20 10:28:46

最近遇到一个问题,写了一个定时任务类,这个类继承了Timetask,需要在这个定时任务类中注入一个XXXService。

最开始我是这样写的:

public class AutoSingleXmYckbTask extends TimerTask {
@Autowired
private XxxxService xxxxService;

private String xx;

public AutoSingleXmYckbTask(String xx){
this.xx=xx;
}
@Override
public void run() {
try{
xxxxService.updateXxxx(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}


结果,代码执行后报了空指针异常,xxxxService = null;

后来查了一下,说在普通类中使用@Autowired,需要在类上加@Component,然后我就在类上加了@Component,结果加完了这个注解后,构造方法的参数报错了(具体原因有待分析,以后补充)如下:

@Component
public class AutoSingleXxxxTask extends TimerTask {
@Autowired
private XxxxService xxxxService;

private String xx;
//加了@Component,这个构造方法的参数xx报错了
public AutoSingleXxxxTask(String xx){
this.xx=xx;
}
@Override
public void run() {
try{
xxxxService.updateXxxx(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}

最终的解决办法

使用外部注入解决了这个问题,具体代码如下:

1.这个定时任务类的代码,给xxxxService设置了geter,seter方法

public class AutoSingleXxxxTask extends TimerTask {


private XxxxService xxxxService;

public XxxxService getXxxxService() {
return xxxxService;
}

public void setXxxxService(XxxxService xxxxService) {
this.xxxxService = xxxxService;
}


private String xx;

public AutoSingleXxxxTask(String xx){
this.xx=xx;
}

@Override
public void run() {
try{
xxxxService.updateAutoXxxxZt(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}

2.因为调用这个定时任务类的地方,是另一个Service类,在这个Service类中可以正常使用@Autowired注入定时任务类XxxxService,所以可以在调用这个类的时候,把xxxxService,用setXxxxService注入到类中。代码如下

@Service
public class XxxxServiceImpl implements XxxxService {
@Autowired//在这个调用那个定时任务类的类里,可以正常使用@Autowired注入xxxxService
private XxxxService xxxxService;
public void saveXxxx(Xxxx xxxx){

Timer timer = new Timer(true);
Date time = DateUtil.transfer2Date(xxxx.getxxsj());
//new一个定时任务类对象
AutoSingleXxxxTask autoSinglexxxxTask = new AutoSingleXxxxTask(xxxx.getxx());
//把xxxxService,set进定时任务类中,就可以正常使用了
autoSingleXxxxTask.setXxxxService(xxxxService);
timer.schedule(autoSingleXxxxTask, time);
}
}

本文摘自 :https://blog.51cto.com/u