如何修改CXF SOAP响应以匹配Axis-2格式:调整前缀与移除命名空间
调整CXF SOAP响应匹配Axis2格式的方案
先对比两个响应的核心差异:
- SOAP Envelope前缀:Axis2用
soapenv,CXF默认用soap loginResponse节点:Axis2用默认命名空间无前缀,CXF自动加ns1前缀loginReturn节点:Axis2设为空命名空间,CXF默认继承父节点命名空间并加ns2前缀
下面是针对性的调整步骤:
1. 把Envelope前缀改成soapenv
Spring配置方式:
<bean id="yourServiceEndpoint" class="org.apache.cxf.jaxws.EndpointImpl"> <property name="properties"> <map> <!-- 指定SOAP信封的前缀为soapenv --> <entry key="soap.env.ns.prefix" value="soapenv"/> </map> </property> </bean>
代码硬编码方式:
Endpoint endpoint = Endpoint.publish("/test-web-api", new LoginServiceImpl()); // 设置信封前缀 endpoint.getProperties().put("soap.env.ns.prefix", "soapenv");
2. 移除loginResponse的命名空间前缀
首先在响应实体类上指定命名空间,同时通过自定义前缀映射器让默认命名空间不显示前缀:
响应实体类修改:
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlElement; @XmlRootElement(name = "loginResponse", namespace = "urn:TestWebAPI") @XmlType(namespace = "urn:TestWebAPI", name = "loginResponse") public class LoginResponse { private String loginReturn; // 给loginReturn指定空命名空间 @XmlElement(name = "loginReturn", namespace = "") public String getLoginReturn() { return loginReturn; } public void setLoginReturn(String loginReturn) { this.loginReturn = loginReturn; } }
自定义命名空间前缀映射器:
import com.sun.xml.bind.marshaller.NamespacePrefixMapper; public class CustomNsPrefixMapper extends NamespacePrefixMapper { @Override public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { // 让urn:TestWebAPI使用空前缀(默认命名空间) if ("urn:TestWebAPI".equals(namespaceUri)) { return ""; } return suggestion; } }
在CXF配置中启用映射器:
<bean id="jaxbDataBinding" class="org.apache.cxf.jaxb.JAXBDataBinding"> <property name="marshallerProperties"> <map> <entry key="jaxb.namespacePrefixMapper" ref="customNsPrefixMapper"/> <!-- 可选:格式化输出XML --> <entry key="jaxb.formatted.output" value="true"/> </map> </property> </bean> <bean id="customNsPrefixMapper" class="com.yourpackage.CustomNsPrefixMapper"/> <!-- 把数据绑定配置到端点 --> <bean id="yourServiceEndpoint" class="org.apache.cxf.jaxws.EndpointImpl"> <constructor-arg ref="yourServiceBean"/> <property name="dataBinding" ref="jaxbDataBinding"/> <property name="properties"> <map> <entry key="soap.env.ns.prefix" value="soapenv"/> </map> </property> </bean>
3. 确认loginReturn的空命名空间设置
上面实体类中@XmlElement(name = "loginReturn", namespace = "")已经明确指定了空命名空间,CXF生成响应时会自动给该节点加上xmlns=""属性,覆盖父节点的命名空间。
调整完成后,CXF生成的SOAP响应就会和Axis2的完全一致。
内容的提问来源于stack exchange,提问作者Mathew Stephen
相关产品推荐
相关产品推荐

