activiti工作流的监听类调用spring中的been

来源:互联网 发布:亚马逊aws 知乎 编辑:程序博客网 时间:2024/06/10 18:25

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