【问题标题】:CXF 2.7.7 org.apache.cxf.interceptor.Fault: Unexpected elementCXF 2.7.7 org.apache.cxf.interceptor.Fault:意外元素
【发布时间】:2013-10-22 03:23:11
【问题描述】:

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

我错过了什么?

【问题讨论】:

  • 您好,我遇到了这个问题,您解决了这个问题吗?有更新吗?提前致谢。
  • @LeoHuang 我现在发布了一个答案,解释了我做了什么
  • 非常感谢,其实我所有的客户端代码都是用cxf-codegen-plugin生成的,而且所有的方法签名都是自动生成的,所以没有意义。

标签: java web-services cxf


【解决方案1】:

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

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

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

【讨论】:

  • 嗨 rjsang,我通过调试到 cxf 源代码解决了这个问题,基本上这个异常是在 DocLiteralInInterceptor 中抛出的,有时是由于响应无效,比如不是文字文档,或者不是有效的肥皂消息。
  • 感谢这篇文章,它很有帮助。如果您也像我一样生成接口,并且您不想在每次重新生成时继续编辑接口,我将添加它,您可以在使用端口的任何地方内联执行此操作:port.getRequestContext() .put("soap.no.validate.parts", "true");
【解决方案2】:

当我发现我的 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) { }
}

【讨论】:

    【解决方案3】:

    我刚刚在我的应用代码中添加了一个自定义的 http 标头,特别是 http 保持活动。 ws 客户端 http 被重用,看起来 cxf 没有在后续调用中重置soap操作标头。

    【讨论】:

      猜你喜欢
      • 2019-04-05
      • 2012-05-22
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2012-08-30
      相关资源
      最近更新 更多