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或者把上面这个函数修改一下.