覆盖CXFerror handling

我正在开发一些基于Web服务的应用程序,我有一个关于Apache CXF解组的问题。 在我们的项目中,我们使用CXF 2.4.1版本。

当某些SOAP请求不正确时(例如某些字段是文本而不是数字),CXF会抛出标准的SOAPFaultException,并使用标准字段构建SOAP响应,例如:

 soap:Client Unmarshalling Error: some field missing  

项目要求说,如果出现任何故障,系统需要以其他格式响应,例如:

   2732 Unmarshalling Error: some field missing  some details   ...   

所以问题是:如何以某种方式覆盖此error handling并以我的格式响应,而不是默认?

提前致谢。

PS我试图调查一些ValidationEventHandler主体,但它在CXF 2.0及更高版本中以其他方式工作。

好的,经过大量研究后我发现了一些CXFerror handling方法。

*。 ValidationEventHandler使您可以抛出自己的exception而不是标准exception。 但是您无法更改响应行为,也无法更改SOAP响应格式。

*。 另一种改变error handling的方法是创建自己的拦截器。 CXF工作流程建立在拦截器链上。 有4种类型的拦截器:inInterceptor,outInterceptor,inFaultInterceptor和outFaultInterceptor。

使用一些智能黑客,您可以通过创建自己的拦截器(将其添加到链)来更改工作流,并从链中删除标准拦截器(如果您知道它的类名)。 所以你可以做任何你需要的事情。

但是,就所有这些拦截器手动编组响应(xmlWriter.writeStartElement()等)而言,为每个流程阶段编写自己的拦截器可能是一个巨大的挑战。 这可能是真正的大量工作。

不幸的是,我还没有找到关于CXF拦截器的好参考。

另一件事 – 如果您需要返回常规响应而不是SOAPFaultException,您可能需要其他信息,例如:返回此响应的实际服务,请求中传递的服务参数等。我没有在拦截器中的可访问参数中找到此信息。 并且,当然,通过这样做,你欺骗客户端代码将返回OK而不是真正的exception。

*。 用所有参数设计你的wsdl作为文本可能是非常不好的解决方案:

一个。 如果wsdl中没有数据类型和validation规则,那么您的服务的使用者可能会非常困惑。

湾 你需要’重新发明轮子’进行validation。 我的意思是你需要编写自己的validation器代码,这些validation器在一些复杂的规则下可能非常困难。 与此同时,XSD已经实施了所有这些validation并进行了良好的测试。

最后是关于我的情况:我们与需求管理器进行了讨论,并决定允许CXF在请求中违反XML模式要求时抛出自己的标准exception。 这是一个很好的解决方案,因为现在我们正在使用XSDvalidation的所有function,不要把时间浪费在复杂和无用的工作上。

非常感谢@ericacm的回答。

您当然可以使用ValidationEventHandler生成比默认值更好的错误响应,并抛出符合JAX-WS Fault规范的Fault。 但它只会让你如此多的定制 – 会有一些你无法控制的元素。 例如,以下是我的某个应用程序的ValidationEventHandler响应:

    soap:Client Errors in request     topicId java.lang.NumberFormatException: For input string: "" [line:6]        

您无法对, and 元素执行任何操作。 但是从都是自定义的。

如果您需要对响应进行更详细的控制,那么您应该将字段类型从numeric更改为string,然后在代码中进行validation,而不是让unmarshaller捕获错误。

是的,我同意,强迫它成为一个字符串会很糟糕,但如果响应必须完全符合您的规定,那么如果没有深入了解CXF而不是JAX-WS层(例如使用拦截器)将是不可能的。

另一种选择是使用CXF转换function

这会将服务器的原始故障映射到任何其他故障,以便客户可以接受。