java - JAX-WS:如何向 SOAP 响应添加额外的 XML 命名空间

标签 java xml web-services soap jax-ws

我有一个使用 JAXWS 自动生成的 Web 服务。该Web服务是实际实现的模拟器,用于测试。实际实现的响应如下所示:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:nsc:RFIDCommandEnum="http://tempuri.org/nsc:RFIDCommandEnum.xsd"
        xmlns:nsc="http://xxx.com/schema/yyy/ltu-tcs"
        xmlns:nse:DeviceStateEnum="http://tempuri.org/nse:DeviceStateEnum.xsd"
        xmlns:nse="http://xxx.com/schema/yyy"
        xmlns:nsl="http://xxx.com/wsdl/yyy/ltu/tcs"
        xmlns:nst="http://xxx.com/wsdl/yyy/tcs/ltu">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <nsl:setDataResponse>
            <result>...</result>
        </nsl:setDataResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

模拟器的相同响应如下所示:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:getDataResponse xmlns:ns2="http://xxx.com/wsdl/yyy/ltu/tcs">
            <result>...</result>
       </ns2:getDataResponse>
    </S:Body>
</S:Envelope>

现在我已经知道像 xmlns:nsc:RFIDCommandEnum 这样的嵌套命名空间会导致问题,所以我需要让模拟器像实际实现一样传递这些命名空间。经过一番谷歌搜索后,我发现我应该这样做:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://xxx.com/schema/yyy/ltu-tcs",
    xmlns = {
        @javax.xml.bind.annotation.XmlNs(prefix = "nsc:RFIDCommandEnum", namespaceURI = "http://tempuri.org/nsc:RFIDCommandEnum.xsd"),
        @javax.xml.bind.annotation.XmlNs(prefix = "nsc", namespaceURI =  "http://xxx.com/schema/epm/ltu-tcs"),
        @javax.xml.bind.annotation.XmlNs(prefix = "nse:DeviceStateEnum", namespaceURI = "http://tempuri.org/nse:DeviceStateEnum.xsd"),
        @javax.xml.bind.annotation.XmlNs(prefix = "nse", namespaceURI = "http://xxx.com/schema/yyy"),
        @javax.xml.bind.annotation.XmlNs(prefix = "nsl", namespaceURI = "http://xxx.com/wsdl/yyy/ltu/tcs"),
        @javax.xml.bind.annotation.XmlNs(prefix = "nst", namespaceURI = "http://xxx.com/wsdl/yyy/tcs/ltu")
    },
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.xxx.yyy.tcs.simulator;

但是这不起作用。包裹com.xxx.yyy.tcs.simulator是webservice的模拟实现类所在的位置。我想我可能需要将这些注释应用于表示 XML 内容的自动生成的类,但无法更改它们,因为它们也在生产代码中使用,我不想用我的命名空间污染它们。

所以我尝试从我的 StandardResponse 中得出代表 <result> 的类元素:

package com.xxx.yyy.tcs.simulator;

// ...

@WebService(name = "LTU_for_TCS", targetNamespace = "http://xxx.com/wsdl/yyy/ltu/tcs")
public class LTU_for_TCS_Impl implements LTUForTCS {
    // ...

    public static final class NamespacePollutedStandardResponse extends StandardResponse {
        private NamespacePollutedStandardResponse(final Application application,
                                                  final ResultCodeEnum code,
                                                  final String message) {
            super(application, code, message);
        }
    }

    @WebMethod
    @WebResult(name = "result", partName = "result")
    @Override
    public GetLTUDataResponse getData(
            @WebParam(name = "application", partName = "application")
            Application application) {
        logger.info("getData");
        return new NamespacePollutedStandardResponse(getApplicationHeader(),
            ResultCodeEnum.SUCCESS,
            "This is the LTU simulator!");
    }
}

但是,这仍然不会改变我从模拟器得到的响应。现在我想知道:我可以更改 StandardResponse 的命名空间列表吗?根本吗?为什么它不能像这样工作 - NamespacePollutedStandardResponsesimulator 的一部分包,因此它应该获得 XmlSchema 中定义的命名空间属性,不是吗?有没有办法将命名空间添加到根元素(我只找到了如何将其添加到有效负载元素之一的信息)?

最佳答案

我通过编写一个 javax.servlet.Filter 解决了这个问题,它将附加 namespace 添加到响应中。这不是很漂亮,但是通过这种方式创建尽可能接近原始答案要容易得多。

关于java - JAX-WS:如何向 SOAP 响应添加额外的 XML 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19518123/

相关文章:

java - Java 中的本地化序号

xml - 基本 XSLT 示例

xml - 将 xml 值读入 Wix 的属性

java - JPA 属性访问给出 NullPointerException

java - Hibernate中双向实体是否需要双方互相添加?

java - 在 Java 接口(interface)中添加新方法,因此它涉及对继承类的最小更改

java - 删除 dom4j 中的元素

java - 无法从同一网络java访问webservice

java - Apache CXF - javax.xml.ws.soap.SOAPFaultException : No security action was defined

java - 带有动态 XSD 的 WSDL