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