当前位置: 首页 > 知识库问答 >
问题:

Apache CXF客户端肥皂故障处理

养昊天
2023-03-14

我在一个独立的java应用程序中使用apache cxf client 3.2.2来调用一些soap Web服务。

试图在单向操作中获取soap故障代码和故障字符串,但没有成功。

我定义了一个自定义拦截器,但它永远不会到达handleMessage

 IncomingFaultInterceptor faultInterceptor = new IncomingFaultInterceptor();
    cxfEndpoint.getInFaultInterceptors().add(faultInterceptor);

定制拦截器的代码

public class IncomingFaultInterceptor extends AbstractSoapInterceptor {

public IncomingFaultInterceptor(){
    super(Phase.RECEIVE);
}


@Override
public void handleMessage(SoapMessage message) throws Fault {
    if(message != null){
        /* log fault string , fault code*/ 
    }


}

}

我遇到的异常是MessageSenderEndingInterceptor(处于PREPARE\u SEND阶段)。

它正在抛出一个新的故障,文本为“无法发送消息”。奇怪的是,捕获的异常是“与......通信时的HTTP响应'500:内部服务器错误'”

如果我用soapui发送相同的请求,我会看到故障代码和故障字符串

HTTP/1.1 500 Internal Server Error
Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
SOAPAction: ""
Content-Type: text/xml;charset=utf-8
Content-Length: 396
Date: Thu, 05 Apr 2018 15:32:27 GMT
Connection: close
Server: Test

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode xmlns:ns0="http://company.com/services/fault">THE_FAULT_CODE</faultcode>
      <faultstring xml:lang="en">THE_FAULT_STRING</faultstring>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

有什么想法,或者我可以做些什么来获取故障代码和故障字符串?cxf中是否有关于客户端拦截器的良好文档?

更新时间:

由于服务器不符合SOAP和WSI标准,似乎无法使用cxf客户端以单向操作获取故障代码和故障字符串。

无论如何,我无法绕过异常并记录故障字符串和故障代码。尝试在生成的代码中注释单向注释,但拦截器仍然无法执行。我找不到关于如何在客户端实现拦截器来处理故障的好例子。

更多信息:

WS-I单向操作的规范。从定义“...例如,在这种情况下不能返回包含故障的“500内部服务器错误”HTTP响应。”

除此之外,“无法发送消息”错误非常令人困惑,因为请求已发送,但此处已报告该错误

共有1个答案

暴阳州
2023-03-14

不明白你为什么要制作自己的拦截器。

看这里:http://cxf.apache.org/docs/developing-a-consumer.html

如果在WSDL中显式描述故障,则会生成故障类,您可以捕获它。

您可以在此处指定故障消息。

<wsdl:operation name="pingMe">
    <wsdl:input name="pingMeRequest" message="tns:pingMeRequest"/>
    <wsdl:output name="pingMeResponse" message="tns:pingMeResponse"/>
    <wsdl:fault name="pingMeFault" message="tns:pingMeFault"/>
</wsdl:operation> 

<wsdl:message name="pingMeFault">
    <wsdl:part name="faultDetail" element="x1:faultDetail"/>
</wsdl:message>
 类似资料:
  • 我试图在JAVA中找到一个简单的(ha)SOAP示例,其中包含一个工作服务,但我发现的任何示例都不工作。 我已经试过这个例子中的这个,但是它不起作用,它要求我输入一个正斜杠,但是它已经输入了,没有任何反应。 有人知道我可以下载/请求和修改的SOAP示例链接吗? 谢谢你的帮助。

  • 我正在使用CamelCXFendpoint连接到我的soap服务器。我想为客户端的请求添加超时。我正在为此使用continuationTimeout选项。但它不起作用。请求超时,而不等待我配置的时间。 下面是我的endpoint配置。

  • 我使用camel和cxf组件从Web服务中获取一些数据。在某些情况下,Web服务返回标准的soap:fault。我有下一个步骤: 阅读cxf和camel邮件列表中的类似问题,我理解cxfendpoint应该抛出异常,如果有soap foalt,org.apache.cxf.binding.soap.soapfault类型的异常,但我不能得到它。onException子句的目标是处理soap错误异常

  • 根据AWS文件: worker使用Java ExecutorService任务调用记录处理器方法。如果任务失败,工作进程将保留对记录处理器正在处理的碎片的控制。工作进程启动一个新的记录处理器任务来处理该碎片。有关详细信息,请参阅阅读节流。 根据AWS文件的另一页: Kinesis客户端库(KCL)依靠您的进程记录代码来处理处理数据记录时出现的任何异常。从进程记录抛出的任何异常都被KCL吸收。为了避

  • 跟随wiki页面https://cwiki.apache.org/qpid/amqp-java-jms-messaging-client.html到https://cwiki.apache.org/qpid/connection-url-format.html. Simple me需要qpid-amqp-1-0-client-jms-0.20-sources。jar接受URI格式,但它似乎忽视了一

  • 问题内容: 有什么方法可以使用soap-rpc Web服务,以便通过共享接口生成客户端?宁静的Web服务以这种方式进行操作,但是基于soap的情况又如何呢?您是否总是需要使用Axis或CXF之类的工具来生成存根和代理,还是有可以动态设置的东西? 谢谢。 编辑#1: 为了澄清,我正在寻找做这样的事情: 通用接口: 该公共接口已经可以用于创建服务器端组件。我的问题是: 客户端可以使用这种类型的通用接口