自从升级到CXF 2.7.7后,我遇到了一个我无法理解的错误。在进行Web服务调用时,CXF会报告此异常:
org.apache.cxf.interceptor.Fault:
Unexpected element {http://schema.myorg.com/GetReference/}ReferenceResponse found.
Expected {http://services.myorg.com/}getReferences
这没有任何意义,因为ReferenceResponse正是我期望的响应。 getReferences这个名称似乎是指被调用的@WebMethod注释方法的名称。此方法的返回类型是ReferenceResponse。
我错过了什么?
答案 0 :(得分:4)
我从来没有找到一个真正令人满意的答案,但是,当我用wsdl2cxf生成的客户端界面替换现有客户端界面时,它已经解决了。这也涉及从Xbeans迁移到JAXB以进行编组,这可能与它有关。
但是,在过渡期间,将以下注释添加到接口可以防止错误。
@EndpointProperty(key = "soap.no.validate.parts", value = "true")
答案 1 :(得分:1)
我发现我的SOAPLoggingHandler默认在其方法中返回 false 时解决了这个问题。它应该更改为 true :
public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public Set<QName> 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) { }
}
答案 2 :(得分:0)
我只是在我的应用程序代码中添加了一个自定义的HTTP标头(特别是http keep live)来实现此目的。 ws客户端http已被重用,并且看起来cxf并未在后续调用中重置soap action标头。