本着前人挖井,后人喝水的原则,前面喝了太多水,今天是时候挖口井了
下面用最简单的例子说明实体属性扩展的大概:
在流程定义文件里增加一个属性,然后解释,接着创建任务的时候把这个属性set进去
<task form="open.jsp" g="395,103,92,52" name="省市场部" role_id="195"> <assignment-handler class="com.zhizhao.assignmentHandler.AssignSingle"/> <transition g="442,233:12,-46" name="同意" to="省客服服务部"/> </task>
如上面代码,在task节点里面增加一个role_id="195"的属性
这时xml一般会报错,因为原来的验证xsd文件根本没这个属性
可以修改jbpm包目录下jpdl-4.4.xsd,定位到 <element name="task">
添加一行(中间那行attribute name="role_id"....)
<attribute name="swimlane" type="string" /> <!-- 自定义--> <attribute name="role_id" type="string" /> <attribute name="form" type="string">
在myeclipse定义好引用,这时不会报错了
找到org.jbpm.pvm.internal.task.TaskDefinitionImpl和org.jbpm.pvm.internal.task.TaskImpl,在里面添加属性roleId
至于get/set我就不说了
jbpm4.4解释流程定义xml的类是
org.jbpm.jpdl.internal.xml.JpdlParser
找到方法parseTaskDefinition,在里面加入两行
public TaskDefinitionImpl parseTaskDefinition(Element element, Parse parse, ScopeElementImpl scopeElement) { //.... 这里看其他怎么写就怎么写 换个属性名而已 String role_id = XmlUtil.attribute(element, "role_id"); taskDefinition.setRoleId(role_id); //.... }
接着就是最重要的,就是jbpm创建任务的方法,这个问题我纠结了很久了,没想到在这里...
org.jbpm.jpdl.internal.activity.TaskActivity
public void execute(ExecutionImpl execution) { DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class); TaskImpl task = dbSession.createTask(); task.setTaskDefinition(taskDefinition); task.setExecution(execution); task.setProcessInstance(execution.getProcessInstance()); task.setSignalling(true); ........ //找个地方写就行 task.setRoleId(taskDefinition.getRoleId()); }
这个方法是jbpm任务创建的时候都会执行的,至于自己创建任务,你想怎么搞就怎么搞吧。。
扩展了当然就要保存到数据库咯,接着修改jbpm.task.hbm.xml,添加属性映射
<property name="roleId" column="ROLE_ID"/>
接着定义就可以保存到jbpm4_task里面咯
有什么不懂可以问