Oracle BPM版本11.1.1.7。在Humantask.task,Events选项卡,Content Change Callbacks部分中,我输入了实现NotesStore的类的完全限定类名以及addNote和getNotes方法。
该类使用AppModule中的公共方法使用我们的自定义表来编写和读取注释,并且这些方法在开发期间使用BC测试器和回调类中的临时main进行了很好的测试。
将项目编译为jar并放置在BPM项目的SCA-INF / lib文件夹中,然后部署SCA和相关的ADF人工任务表单。
在流程实例期间在开箱即用的人工任务评论部分中发表评论时,会调用该类,但在创建AppModule的行中的getNotes方法中会发生异常:
java.lang.ClassCastException:oracle.jbo.common.ampool.PoolMgr
在类中,AppModule创建如下:
AuditModule service = (AuditModule)Configuration.createRootApplicationModule("com.co.modules.AuditModule", "AuditModuleLocal");
我尝试将一个web.xml配置文件添加到SCA BPM项目,其过滤器为discussed in this post(最后一个答案)。这讨论了触发ADF上下文初始化,但我仍然得到错误。
问题是,如何使用人工任务的回调来调用使用AppModule公共方法进行数据库工作的方法? Oracle's documentation在这方面非常稀少(29.11.1)。
更新
事实证明,堆栈跟踪显示它在查找数据源名称时遇到问题,并且实际上是在抛出JBO错误。如果有人遇到此问题,请检查堆栈跟踪是否存在其他问题。
UPDATE2
最后得到这个将任务注释写入自定义注释表。事实证明,在注释回调类中似乎不可能使用AppModule / Model方法,因为在调用类时似乎无法启动所需的ADF上下文。通过重写类以直接在代码中访问DB,注释回调类会写入表。但是,我收到与this post相同的错误。即:
Exception invoking method from XML data control. Cause:oracle.bpel.services.workflow.client.WorkflowServiceClientException: java.rmi.UnmarshalException: cannot unmarshaling return; nested exception is:
Supplemental Detail java.io.IOException: Error: Unexpected type encountered in writeExternal oracle.bpel.services.workflow.client.WorkflowServiceClientException: java.rmi.UnmarshalException: cannot unmarshaling return; nested exception is:
java.io.IOException: Error: Unexpected type encountered in writeExternal
我怀疑这是一个Oracle框架问题,因为传回的类型来自NotesStore实现,它们都传递回框架:
public class CommentsCallback implements NotesStore, Serializable...
public List<CommentType> getNotes(Task task)
有人解决了这个问题吗?完整的堆栈跟踪:
答案 0 :(得分:0)
在与Oracle讨论之后,避免意外类型错误的关键是使用ObjectFactory来填充CommentType对象。虽然我们最终采用了不同的方法,但下面的代码是由Oracle提供的,可能会帮助有人尝试这样做:
import oracle.bpel.services.workflow.task.model.ObjectFactory;
import oracle.bpel.services.workflow.task.model.CommentType;
import oracle.bpel.services.workflow.task.model.IdentityType;
...
ObjectFactory factory = new ObjectFactory()
CommentType commentType = factory.createCommentType();
IdentityType updatedBy = factory.createIdentityType();
updatedBy.setId("some user");
updatedBy.setType(IWorkflowConstants.IDENTITY_TYPE_USER);
updatedBy.setDisplayName("some user display name");
commentType.setUpdatedBy(updatedBy);
commentType.setComment("some comment");
...set the rest of the comment fields as necessary...