繁体   English   中英

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

[英]CXF 2.7.7 org.apache.cxf.interceptor.Fault: Unexpected element

自升级到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。

我想念什么?

我从未找到一个真正令人满意的答案,但是当我用wsdl2cxf生成的现有客户端接口替换了现有的客户端接口时,该问题就解决了。 这还涉及从Xbeans迁移到JAXB进行封送处理,这可能与它有关。

但是,在此期间,向接口添加以下注释可防止该错误。

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

当发现默认情况下我的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) { }
}

我只是通过在我的应用程序代码中添加自定义http标头(特别是http keep live)来实现的。 ws客户端http已被重用,并且看起来cxf并未在后续调用中重置soap action标头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM