部署在 Weblogic 12c 中时的 CXF 客户端更改请求

问题描述 投票:0回答:3
cxf weblogic12c
3个回答
1
投票

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

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

我最终编写了拦截器来替换 body 下的整个“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);

0
投票

如果应用程序是企业应用程序(ear),则在 weblogic-application.xml 中添加以下标签

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


0
投票

我在 weblogic 12.2.1.4 v.cxf 中遇到了同样的问题,这是由于在父元素中添加了默认 ns 引起的,这可以通过排除 jaxb/xml 绑定依赖项来解决:-

<properties>
    <cxf.version>3.5.7</cxf.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
            </exclusion>
            <exclusion>
                <groupId>jakarta.xml.bind</groupId>
                <artifactId>jakarta.xml.bind-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
© www.soinside.com 2019 - 2024. All rights reserved.