【问题标题】:CXF Client Changes request when deployed in Weblogic 12c在 Weblogic 12c 中部署时的 CXF 客户端更改请求
【发布时间】:2017-11-30 17:06:03
【问题描述】:

我在 weblogic 12c 中部署 CXF 客户端时遇到问题。

如果我用码头运行客户端我没有问题,这是请求:

<soap:Body>
  <ns2:getSegmento xmlns:ns2="http://api.service.web.dummy.com/" xmlns:ns3="http://model.api.dummy.com">
     <descripcionSegmento>EXTG</descripcionSegmento>
  </ns2:getSegmento>

但是weblogic中的同一个客户端生成这个请求:

<env:Body>
  <getSegmento xmlns="http://api.service.web.dummy.com/" xmlns:ns3="http://model.api.dummy.com" xmlns:ns2="http://api.service.web.dummy.com/">
     <descripcionSegmento>EXTG</descripcionSegmento>
  </getSegmento>

我注意到 weblogic 中缺少命名空间,可能是依赖关系?

依赖关系:

org.apache.cxf:cxf-rt-frontend-jaxws:3.1.9
org.apache.cxf:cxf-rt-transports-http:3.1.9
org.apache.cxf:cxf-rt-databinding-aegis:3.1.9
org.apache.cxf:cxf-rt-bindings-corba:3.1.9
org.apache.cxf:cxf-rt-transports-jms:3.1.9
org.apache.cxf:cxf-rt-ws-security:3.1.9

Weblogic配置:

<prefer-application-packages>
        <package-name>antlr.*</package-name>
        <package-name>javax.servlet.jsp.jstl.*</package-name>
        <package-name>javax.wsdl.*</package-name>
        <package-name>org.antlr.*</package-name>
        <package-name>org.aopalliance.*</package-name>
        <package-name>org.apache.*</package-name>
        <package-name>org.apache.xerces.*</package-name>
        <package-name>org.aspectj.*</package-name>
        <package-name>org.hibernate.*</package-name>
        <package-name>org.mozilla.*</package-name>
        <package-name>org.slf4j.*</package-name>
        <package-name>org.springframework.*</package-name>
    </prefer-application-packages>

我在使用 weblogic 请求的服务中出现此错误:

Root cause of ServletException.
javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unexpected element (uri:"http://api.service.web.dummy.com/", local:"descripcionSegmento"). Expected elements are <{}descripcionSegmento>

请提供任何想法/帮助,将不胜感激

【问题讨论】:

    标签: cxf weblogic12c


    【解决方案1】:

    我确实遇到了这个问题,我在下面尝试了但没有帮助:

    1. weblogic.xml 和/或 weblogic-application.xml 中将 wls:prefer-web-inf-classes 更改为 true/false
    2. weblogic-application.xmlwls:prefer-application-packages 中添加了依赖项
    3. 已将 cxf 版本更改为最新版本

    我最终编写了拦截器来替换正文下的整个“getSegmento”元素,如下所示:

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    
    import javax.xml.soap.SOAPBody;
    import javax.xml.soap.SOAPMessage;
    
    import org.apache.cxf.binding.soap.SoapMessage;
    import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
    import org.apache.cxf.interceptor.Fault;
    import org.apache.cxf.message.Message;
    import org.apache.cxf.phase.AbstractPhaseInterceptor;
    import org.apache.cxf.phase.Phase;
    import org.apache.cxf.phase.PhaseInterceptor;
    import org.w3c.dom.Element;
    
    
    public class MyRequestInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
    
    private List<PhaseInterceptor<? extends Message>> extras = new ArrayList<PhaseInterceptor<? extends Message>>(1);
    public MyRequestInterceptor() {
    super(Phase.USER_PROTOCOL);
    extras.add(new SAAJOutInterceptor());
    }
    public Collection<PhaseInterceptor<? extends Message>> getAdditionalInterceptors() {
    return extras;
    }
    public void handleMessage(SoapMessage message) throws Fault {
    SOAPMessage msg = message.getContent(SOAPMessage.class);
    try {
    SOAPBody e = msg.getSOAPBody();
    Element actionElement = msg.getSOAPPart().createElementNS("http://api.service.web.dummy.com/", 
            "ns2:getSegmento");
    actionElement.appendChild(e.getFirstChild().getFirstChild());
    e.replaceChild(actionElement, e.getFirstChild());
    } catch (Exception e) {
    throw new Fault(e);
    }
    }
    }
    

    并在创建客户端时添加了这个拦截器:

        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(serviceInterfaceClass);
        factory.setAddress(endpoint);
        MyRequestInterceptor interceptr = new MyRequestInterceptor();
        factory.getOutInterceptors().add(interceptr);
    

    【讨论】:

    • 希望对您有所帮助!
    • 关于本主题的下一个问题,您能否详细说明如何声明 prefer-application-packages,因为 cxf 文档参考 javax.jws.*
    【解决方案2】:

    如果应用是企业应用(ear),则在weblogic-application.xml中添加如下标签 <prefer-application-packages> <package-name>org.apache.cxf.*</package-name> </prefer-application-packages> 如果应用程序是 web-application(war),则在 weblogic.xml 中添加上述行 prefer-application-packages 元素指定必须始终从应用程序加载的类的包列表。 请参考https://docs.oracle.com/cd/E24329_01/web.1211/e21049/weblogic_xml.htm#WBAPP663

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多