1. 程式人生 > >activiti工作流的監聽類呼叫spring中的been

activiti工作流的監聽類呼叫spring中的been

在我們使用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);
    }
}