activiti工作流的監聽類呼叫spring中的been
阿新 • • 發佈:2019-01-10
在我們使用activiti監聽類的時候有時需要呼叫spring中的been,但是你會發現如果在監聽類中直接引入been會報null指標異常。如下:
public class QsbgEndLintener implements ExecutionListener{
private static final long serialVersionUID = 1L;
@Autowired
private QsbgService qsbgService;
@Override
public void notify(DelegateExecution arg0) throws Exception {
String piId = arg0.getProcessInstanceId();
Qsbg qsbg = new Qsbg();
qsbg.setProcessInstanceId(piId);
qsbg.setSfbl("2"); //設定辦結
qsbgService.updateByPiId(qsbg);
}
}
原因是QsbgEndLintener 類是在activiti中直接new的,所以注入QsbgService 必然是空。
這裡有種方法就是spring提供的一種方法可以讓外面的程式呼叫spring的been及實現ApplicationContextAware類。
1、實現ApplicationContextAware拿到applicationContext獲取been
public class SpringUtil implements ApplicationContextAware {
/**
* 當前IOC
*
*/
private static ApplicationContext applicationContext;
/**
* * 設定當前上下文環境,此方法由spring自動裝配
*
*/
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
applicationContext = arg0;
}
/**
* 從當前IOC獲取bean
*
* @param id
* bean的id
* @return
*
*/
public static Object getObject(String id) {
Object object = null;
object = applicationContext.getBean(id);
return object;
}
}
2、在spring.xml中配置been
<bean id="springUtil" class="com.train.util.SpringUtil"/>
<bean id="qsbgListenerServer" class="com.train.service.oa.QsbgService"></bean>
3、在activiti監聽類中呼叫qsbgListenerServer
public class QsbgEndLintener implements ExecutionListener{
private static final long serialVersionUID = 1L;
@Override
public void notify(DelegateExecution arg0) throws Exception {
QsbgService qsbgService = (QsbgService)SpringUtil.getObject("qsbgListenerServer");
String piId = arg0.getProcessInstanceId();
Qsbg qsbg = new Qsbg();
qsbg.setProcessInstanceId(piId);
qsbg.setSfbl("2"); //設定辦結
qsbgService.updateByPiId(qsbg);
}
}