在交易路线中使用CXF和Camel自定义@Webfaults

时间:2013-07-05 10:06:17

标签: jax-ws cxf apache-camel

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

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

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

谢谢!

2 个答案:

答案 0 :(得分: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 - &gt; 2.7.5

答案 1 :(得分:0)

自定义异常是已检查的异常,并且驼峰路由已处理。因此,自定义异常包含在RuntimeCamelException中,而RuntimeCamelException又会回滚事务。

如果您有这样的设置,请考虑从RuntimeExceptions继承子类,如果可以的话。

此外,Camel CxfConsumer应该将RuntimeCamelException的原因设置为故障(如果它存在),它现在还没有。我创建了CAMEL-6526来跟踪此问题。