gpt4 book ai didi

java - 覆盖 CXF 错误处理

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:57 28 4
gpt4 key购买 nike

我正在开发一些基于 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>

所以问题是:我怎样才能以某种方式覆盖此错误处理并以我的格式而不是默认格式进行响应?

提前致谢。

附言我试图研究一些 ValidationEventHandler 原则,但它在 CXF 2.0 及更高版本中以其他方式工作。

最佳答案

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

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

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

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

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

不幸的是,我没有找到关于 CXF 拦截器的好引用。

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

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

一个。如果 wsdl 中没有数据类型和验证规则,您的服务的消费者可能真的很困惑。

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

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

非常感谢@ericacm 的回答。

关于java - 覆盖 CXF 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10194748/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com