我正在将Web服务从Weblogic迁移到JBoss。其中一个现有客户端使用对所使用的名称空间前缀敏感的解析器,但我无法对此产生影响。迁移已经改变了一些前缀,我需要能够恢复它们。
我查看了各种选项,其中许多来自this answer,但似乎都没有。
我正在使用cxf-codegen-plugin
并从WSDL生成我的源代码。这似乎让我无法在我的资源中添加注释。
我也不使用Spring和CXF(因为这不是一个Spring应用程序,我正在部署到本地使用CXF的JBoss),所以我没有CXF documentation中描述的选项使用jaxws:dataBinding
(如果我有这个选项,我不明白如何配置它。)
我已经看到至少one code-based JAXB example设置了一个marshaller属性,但是无法看到如何以声明方式执行此操作。
我的JAXB调用已涉及用于映射bindings.xml
类型的自定义dateTime
(由于与现有代码相关的遗留原因),我期待可能出现相同行的内容,但我还没有能够发现它。
考虑到这些限制,有没有人知道如何做到这一点?
答案 0 :(得分:1)
使用SOAPHandler并在网络服务中指定为handlerchain
。
@HandlerChain(file="/handler-chain.xml")
public class WebserviceImpl {
handler-chain.xml (在WEB-INF/classes
内)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>NamespacePrefixHandler</handler-name>
<handler-class>com.my.package.CustomHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
实施handleMessage()
以获取soapenvelope并根据需要设置前缀。
final SOAPMessage soapMessage = context.getMessage();
final SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
final SOAPBody soapBody = soapMessage.getSOAPBody();
soapEnvelope.setPrefix("my");
soapEnvelope.removeNamespaceDeclaration("soap");
removeNSprefix(soapBody.getChildElements());
soapBody.setPrefix("my");