小编典典

覆盖CXF错误处理

java

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

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

<soap:Fault>
    <faultcode>soap:Client</faultcode>
    <faultstring>Unmarshalling Error: some field missing</faultstring>
</soap:Fault>

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

<soap:body>
    <ResponseState>
        <ErrorCode>2732</ErrorCode>
        <ErrorMessage>Unmarshalling Error: some field missing</ErrorMessage>
        <ErrorDetails> some details </ErrorDetails>
        <some other fields>
        ...
    </ResponseState>
</soap:body>

所以问题是:如何以某种方式覆盖此错误处理并以我的格式(而不是默认格式)响应?

提前致谢。

PS我试图研究一些ValidationEventHandler主体,但是它在CXF 2.0和更高版本中以其他方式起作用。


阅读 344

收藏
2020-11-16

共1个答案

小编典典

好的,经过大量研究,我发现了CXF错误处理的一些方法。

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

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

使用一些聪明的技巧,您可以通过创建自己的拦截器(将其添加到链中)来更改工作流程,并从链中删除标准拦截器(如果您知道它的类名)。因此,您实际上可以执行所需的任何操作。

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

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

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

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

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

b。您需要“重新发明轮子”进行验证。我的意思是,您需要编写自己的验证器,这对于某些复杂的规则可能非常困难。同时,XSD实施了所有验证,并进行了良好的测试。

最后是我的情况:我们与需求管理器进行了讨论,并决定如果请求中违反XML模式要求,则允许CXF抛出它自己的标准异常。这是一个很好的解决方案,因为现在我们正在使用XSD验证的所有功能,并且不会在复杂而无用的工作上浪费时间。

非常感谢@ericacm的回答。

2020-11-16