當前位置:首頁 > IT技術(shù) > Web編程 > 正文

繼承timetask的類使用@Autowired注入為null,類加了@component構(gòu)成方法參數(shù)報錯
2021-10-20 10:28:46

最近遇到一個問題,寫了一個定時任務(wù)類,這個類繼承了Timetask,需要在這個定時任務(wù)類中注入一個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();
}
}
}


結(jié)果,代碼執(zhí)行后報了空指針異常,xxxxService = null;

后來查了一下,說在普通類中使用@Autowired,需要在類上加@Component,然后我就在類上加了@Component,結(jié)果加完了這個注解后,構(gòu)造方法的參數(shù)報錯了(具體原因有待分析,以后補充)如下:

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

private String xx;
//加了@Component,這個構(gòu)造方法的參數(shù)xx報錯了
public AutoSingleXxxxTask(String xx){
this.xx=xx;
}
@Override
public void run() {
try{
xxxxService.updateXxxx(xx);
}catch (Exception e) {
e.printStackTrace();
}
}
}

最終的解決辦法

使用外部注入解決了這個問題,具體代碼如下:

1.這個定時任務(wù)類的代碼,給xxxxService設(shè)置了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.因為調(diào)用這個定時任務(wù)類的地方,是另一個Service類,在這個Service類中可以正常使用@Autowired注入定時任務(wù)類XxxxService,所以可以在調(diào)用這個類的時候,把xxxxService,用setXxxxService注入到類中。代碼如下

@Service
public class XxxxServiceImpl implements XxxxService {
@Autowired//在這個調(diào)用那個定時任務(wù)類的類里,可以正常使用@Autowired注入xxxxService
private XxxxService xxxxService;
public void saveXxxx(Xxxx xxxx){

Timer timer = new Timer(true);
Date time = DateUtil.transfer2Date(xxxx.getxxsj());
//new一個定時任務(wù)類對象
AutoSingleXxxxTask autoSinglexxxxTask = new AutoSingleXxxxTask(xxxx.getxx());
//把xxxxService,set進定時任務(wù)類中,就可以正常使用了
autoSingleXxxxTask.setXxxxService(xxxxService);
timer.schedule(autoSingleXxxxTask, time);
}
}

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

開通會員,享受整站包年服務(wù)立即開通 >