CXF 2.7.7 org.apache.cxf.interceptor.Fault:意外的元素

我遇到了自升级到CXF 2.7.7后无法理解的错误。 在进行Web服务调用时,CXF会报告此exception:

org.apache.cxf.interceptor.Fault: Unexpected element {http://schema.myorg.com/GetReference/}ReferenceResponse found. Expected {http://services.myorg.com/}getReferences 

这没有任何意义,因为ReferenceResponse正是我期望的响应。 getReferences这个名称似乎是指被调用的@WebMethod注释方法的名称。 此方法的返回类型是ReferenceResponse。

我错过了什么?

我从来没有找到一个真正令人满意的答案,但是,当我用wsdl2cxf生成的客户端界面替换现有客户端界面时,它就解决了。 这也涉及从Xbeans迁移到JAXB进行编组,这可能与它有关。

但是,在临时添加以下注释到接口阻止了错误。

 @EndpointProperty(key = "soap.no.validate.parts", value = "true") 

当我发现我的SOAPLoggingHandler默认在其方法中返回false时,我已经解决了这个问题。 它应该改为true

 public class SOAPLoggingHandler implements SOAPHandler { @Override public Set getHeaders() { return null; } @Override public boolean handleMessage(SOAPMessageContext context) { SOAPMessage message= context.getMessage(); boolean isOutboundMessage = (Boolean)context.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY); if(isOutboundMessage){ System.out.println("OUTBOUND MESSAGE\n"); }else{ System.out.println("INBOUND MESSAGE\n"); } try { message.writeTo(System.out); } catch (SOAPException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return true; } @Override public boolean handleFault(SOAPMessageContext context) { SOAPMessage message= context.getMessage(); try { message.writeTo(System.out); } catch (SOAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } @Override public void close(MessageContext context) { } } 

我只是通过在我的应用程序代码中添加自定义http标头来实现这一点,特别是http keep alive。 ws客户端http被重用,看起来cxf没有在后续调用中重置soap动作头。