1

我正在通过 bpelx:exec 从 BPEL 调用一个 java 类。如果该类能够抛出特定的故障(BPEL 从其合作伙伴链接之一知道),这将大大简化事情。我们称它为 AdapterFault。AdapterFault 由 wsimport 和子类 Exception 生成。

这是 Embedded Java 块中的代码:

Object wfr = getVariableData("inputVariable","request");
Object req = getVariableData("V_CreateServiceRequest","createTNRequestPart");

somepackage.EndpointIterator it =
new somepackage.EndpointIterator();

it.setWFRequest(wfr);
it.setPlatformName("MMSC");
it.setOperationName("createTN");
it.setRequest(req);

Object reply = it.invoke();

setVariableData("V_CreateServiceResponse","createTNResponsePart",reply);

当我将 java 方法声明为抛出 AdapterFault 时,BPEL 拒绝部署并抱怨 Exception 未捕获。Java 标注步骤似乎只声明了 BPELFault。

我只能抛出 RuntimeException,它会转到 CatchAll 块而不是 catch(AdapterFault)。

有没有一种简单的方法可以从 java 调用中抛出已检查的故障?

4

2 回答 2

1

如果它是 WSIF 绑定,则在“异常处理”标题下有说明但那篇文章已经很老了。

对于 bpelx:exec (我认为),您需要在块中捕获异常并更新变量

尝试 {
... 做事

} 捕捉(异常前){

addAuditTrailEntry("异常信息:" + ex.getMessage());

setVariableData("V_CreateServiceException",...

}

}

于 2011-06-14T13:51:49.160 回答
1

只能抛出 BPELFault:

http://forums.oracle.com/forums/thread.jspa?threadID=547192

但它可能包括嵌套部分,这是“真正的”异常,可以在 Catch 块中提取并在需要时重新抛出。

我今天已经实施了。

陷阱:

  • Catch 块应该捕获系统异常之一,例如remoteFault。
  • RuntimeFault.wsdl shall be imported (wsdl:import) into one of the partner WSDLs, otherwise a nasty error saying that BPELFault is not found will be thrown

BPELFault is rather limited in that it can only have code, message and detail elements, all plain text. Passing a complex nested fault type to BPEL is possible via bpelFault.setPart("myname",obj), but I don't know how to extract it from the BPELFault, as BPEL sees no "dynamic" parts. Code and message is enough for my purposes though.

于 2011-06-14T15:45:56.527 回答