我确实遇到了这个问题,我尝试了以下方法但没有帮助:
我最终编写了拦截器来替换 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);
如果应用程序是企业应用程序(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
我在 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>