1

问题:我在 CxfConsumer 后面的事务处理路由中抛出了 @Webfault 带注释的检查异常,但在客户端上,详细信息标签不存在,并且 Camel 无法将异常映射回我的自定义类型。这已经在前面讨论过,没有骆驼部分。

我的解决方案:我发现这个老问题完全实现了我想要做的事情,那么为什么它不起作用?我开始深入研究 CxfConsumer 代码,发现我的自定义异常始终包含在 RuntimeCamelException 中,因此对 @Webfault 注释的检查失败。在修补 CxfConsumer 以检查 RuntimeCamelException 的包装原因后,一切都按预期工作。

现在我的问题是:我不想使用 CxfConsumer 的补丁版本,所以我需要确定我是否做错了什么,或者 CxfConsumer 是否没有处理我的用例。为什么我的自定义异常包含在 RuntimeCamelException 中,我可以以某种方式阻止它还是我在这里遗漏了什么?

谢谢!

4

2 回答 2

0

据我了解,您的问题是“未设置故障详细信息”。你要设置它。

这是 Cxf 的标准行为。这背后存在安全问题。在开发模式下,您可以通过向端点添加一些配置参数来禁用此行为。

例如这个 spring/bluepring 上下文示例启用异常中的详细信息。在开发中非常有用。

<jaxws:endpoint id="TenantsWS" address="/TenantsWS" implementor="#TenantsBean">
    <jaxws:properties>
        <entry key="faultStackTraceEnabled" value="true" />
        <entry key="exceptionMessageCauseEnabled" value="true" />
    </jaxws:properties>
</jaxws:endpoint>
<bean id="TenantsBean" class="com.myfundation.services.WsTenants"/>

如您所见,我只是将一些 jaxws:properties 添加到“标准”端点配置中。

对于您问题的第二部分,为什么您的异常包含在 RuntimeCamelException 中......我不知道。但是我的个性化异常总是用类似这样的注释:WebFault(name = "MyException")。我很确定您搜索的所有内容都在 jaxws:properties 中。

CXF-> 2.7.5

于 2013-07-06T18:18:43.113 回答
0

自定义异常是受检异常,骆驼路线被处理。因此,自定义异常被包装在 RuntimeCamelException 中,后者反过来回滚事务。

如果你有这样的设置,如果可以的话,考虑从 RuntimeExceptions 子类化你的异常。

此外,Camel CxfConsumer 应该将 RuntimeCamelException 的原因设置为错误(如果它存在),但它目前还没有。我创建了CAMEL-6526来跟踪这个问题。

于 2013-07-09T15:03:12.403 回答