使用CXF / JAXB生成自定义名称空间前缀(WSDL优先)

时间:2018-02-15 01:11:33

标签: web-services jaxb cxf jaxb2 cxf-codegen-plugin

我正在将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(由于与现有代码相关的遗留原因),我期待可能出现相同行的内容,但我还没有能够发现它。

考虑到这些限制,有没有人知道如何做到这一点?

1 个答案:

答案 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");