Jax ws 事务路由中带有CXF和Camel的自定义@Webfaults
问题:我正在CxfConsumer后面的事务处理路由中抛出@Webfault注释的已检查异常,但在客户端上,details标记不存在,Camel无法将异常映射回我的自定义类型。前面已经讨论过这一点,但没有讨论驼峰部分 我的解决方案是:我找到了我想要实现的东西,为什么它不起作用呢?我开始深入研究CxfConsumer代码,发现我的自定义异常总是包装在RuntimeCamelException中,因此对@Webfault注释的检查失败。在修补CxfConsumer以检查运行时异常的原因后,一切正常 现在我的问题是:我不想使用经过修补的CxfConsumer版本,所以我需要找出我是否做错了什么,或者CxfConsumer是否无法处理我的用例。为什么我的自定义异常被包装在RuntimeCamelException中,我能以某种方式防止这种情况发生,或者我在这里遗漏了什么Jax ws 事务路由中带有CXF和Camel的自定义@Webfaults,jax-ws,cxf,apache-camel,Jax Ws,Cxf,Apache Camel,问题:我正在CxfConsumer后面的事务处理路由中抛出@Webfault注释的已检查异常,但在客户端上,details标记不存在,Camel无法将异常映射回我的自定义类型。前面已经讨论过这一点,但没有讨论驼峰部分 我的解决方案是:我找到了我想要实现的东西,为什么它不起作用呢?我开始深入研究CxfConsumer代码,发现我的自定义异常总是包装在RuntimeCamelException中,因此对@Webfault注释的检查失败。在修补CxfConsumer以检查运行时异常的原因后,一切正常
谢谢 据我所知,您的问题是“故障细节未设置”。您需要设置它 这是Cxf的标准行为。这背后有安全问题。 在开发模式下,您可以通过向端点添加一些配置参数来禁用此行为 例如,这个spring/bluespring上下文示例启用异常中的细节。在开发中非常有用
<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自定义异常是一个选中的异常,驼峰路线被处理。因此,自定义异常被包装在RuntimeCamelException中,RuntimeCamelException反过来回滚事务
如果您有这样的设置,请考虑如果可能的话,从运行时异常中对异常进行子类化。
此外,Camel CxfConsumer应该将RuntimecameleException的原因设置为fault(如果存在),但到目前为止还没有设置。我创建跟踪此问题 设置“exceptionMessageCauseEnabled”没有效果,但是“faultStackTraceEnabled”起作用。很遗憾,我不需要stacktrace。如果您没有将Camel包装在CXF中,那么这可能是一种方法。因此,对不起,我不理解这个问题。您已经了解了Camel中异常的管理吗?是的,这就是我正在使用的。问题与事务路由有关,我补充了一个答案。