当前位置: 首页 > 面试题库 >

覆盖CXF错误处理

喻珂
2023-03-14
问题内容

我正在开发一些基于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和更高版本中以其他方式起作用。


问题答案:

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

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

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

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

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

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

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

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

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

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

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

非常感谢@ericacm的回答。



 类似资料:
  • 我正在使用EclipseMars4.5。2.当为我的应用程序运行覆盖率测试时(到目前为止有317种测试方法),当它即将完成时(大约运行274种方法),我遇到了无法找到解决方案的错误。 首先弹出一个窗口,上面写着: 无保险数据 在此覆盖率会话期间未收集覆盖率数据。 请不要从Eclipse手动终止Java进程。 一个secon弹出窗口: 'com。山民。埃克莱玛。内部的果心发射。AgentServer

  • 到目前为止,我已经在IntelliJ中尝试了几个小时的代码覆盖率测试,但没有成功。 RuntimeException:存根! 现在,我已经读到在模块选项中更改依赖顺序可以修复这个问题。所以在改变顺序后,我得到了这个错误: 它指向下面的代码: 我谷歌了又谷歌,但唉,到目前为止我还没有找到解决方案。

  • 问题内容: 我正在用Go编写Web应用程序的代码,尽管各种mux库提供了一种设置自定义404错误处理程序的方法,但其他4xx和5xx错误代码却一无所获。 一种建议是在ResponseWriter界面中重写WriteHeader方法并检查状态代码,但是我对如何实际写入感到困惑(在输出之前重写ResponseWriter方法)。从negroni包中可以找到一个可能的例子。 这是为4xx和5xx错误提供

  • 我最近开始和Kotlin一起学习,并开始了一个使用Kotlin的Spring靴宠物项目。 我试图将一个自定义用户域对象集成到Spring Security中,因此希望实现UserDetails接口。 > 意外重写:以下声明具有相同的JVM签名(getUsername()ljava/lang/string;):public final fun ():kotlin.string,public abst

  • 问题内容: 我最近在愚弄一些Ajax轮询技术。但是,似乎我无法从FireFox(3.6.7)中的对象覆盖处理程序。 在跟踪为什么FF在尝试访问时引发异常的问题时,我意识到这取决于是否调用了该方法。 换句话说,这是一个有效的示例(纯js,到目前为止没有jQuery): (这只是为了演示而进行了相当简化) 更好的说是可行的,可以在这里访问。如果我切换最后两行代码,FF会引发异常,基本上是告诉我不允许访

  • 在下图中,我想把分数作为绿色椭圆内的文本。但是,不管循环中的和函数的顺序如何,椭圆都会在文本上绘制。有人能提出原因吗?我的循环如下所示。