我正在开发一些基于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会引发异常,基本上是告诉我不允许访
在下图中,我想把分数作为绿色椭圆内的文本。但是,不管循环中的和函数的顺序如何,椭圆都会在文本上绘制。有人能提出原因吗?我的循环如下所示。