jBPM中如何配置自定义的Converter来支持使用自定义的对象作为流程变量?
|
Frederick
2007-09-11
如题。
我需要使用一个枚举 enum 作为一个任务实例的变量。 我用了这样的代码来存变量: Map taskType = new HashMap(); taskType.put(JbpmWorkflowConstants.TASK_TYPE, TaskType.SUBMITTED); ti.addVariables(taskType); 使用了这样的代码来取变量: taskType == (TaskType) ti.getVariable(JbpmWorkflowConstants.TASK_TYPE) 结果发现取回来的ti.getVariable(JbpmWorkflowConstants.TASK_TYPE)实际上是什么ByteArray。 之后,我尝试先用TaskType.SUBMITTED.toString()把枚举转换成String然后在存,最后发现取出来的还是ByteArray。我又尝试用TaskType.SUBMITTED.ordinal()把枚举先转换成int然后再存,发现取出来的还是ByteArray。 我算是糊涂了。 最后想能不能配置自定义的Converter来让jBPM支持我需要的类型。 那位知道具体的办法的? |
|
|
Frederick
2007-09-11
读了一下源代码,发现原因是jBPM存变量的时候,使用了SerializableToByteArrayConverter这个Converter。它把TaskType用 converter.convert()方法转换了。但是jBPM从数据库里面读取数据的时候,没有用converter.revert()方法转换回来,原因是Converter 为空。为什么在存的时候会使用Converter,读取的时候却没有使用Converter呢?
不知道是jBPM的bug还是什么其他原因。正在查询中。 那位兄弟知道原因的可否指点一下? |
|
|
youngliuus
2007-09-11
我以前遇到过一个问题和你这个很像,不知道是不是一回事儿,你可以参考一下.
在JBPM_VARIABLEINSTANCE这个表中,用CLASS_来确定是什么类型的变量. 在从数据库里读取的时候,有的driver(我遇到的是weblogic的oracle driver)会在正常的值后面加一个空格,这样就造成在去找对应的converter的时候就找不到了. 你可以跟踪一下org.jbpm.db.hibernate.ConverterEnumType的nullSafeGet方法,如果是在这里找不到converter,那就是这个原因了. 如果是这个原因,那解决方法就是换一个driver或者把上面这个函数修改一下. |

