web-services - 使用 JAX-WS 修改 Web 服务的响应

标签 web-services soap jax-ws

如何像这样修改响应的命名空间:

旧回复:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:GetAmountResponse xmlns:ns2="http://ws.dsi.otn.com/dab">
         <etat>0</etat>
         <montant>500.0</montant>
      </ns2:GetAmountResponse>
   </soap:Body>
</soap:Envelope>

想要的新回复:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <GetAmountResponse xmlns="http://ws.dsi.otn.com/dab">
         <etat>0</etat>
         <montant>500.0</montant>
      </GetAmountResponse>
   </soap:Body>
</soap:Envelope>

我想删除 ns2 namespce 前缀。

最佳答案

在第一种情况下,GetAmountResponse位于命名空间 http://ws.dsi.otn.com/dabetatmontant位于默认(空)命名空间中。

在您想要的新消息中,GetAmountResponse , etatmontant都在命名空间 http://ws.dsi.otn.com/dab .

命名空间可以从你的类的命名空间中控制。全部使用相同的命名空间,您将拥有它们在相同的命名空间中,保留类的默认值,它们默认为空命名空间。

例如,如果您的 Web 服务类中有这样的内容:

@WebMethod
    public 
    @WebResult(name = "getAmountResponse", targetNamespace = "http://ws.dsi.otn.com/dab")
    AmountResponse getAmount(
            @WebParam(name = "getAmountRequest", targetNamespace = "http://ws.dsi.otn.com/dab") AmountRequest request) {

        AmountResponse response = new AmountResponse();
        response.setEtat(0);
        response.setMontant(500.0);

        return response;
    }

使用这样的响应类:
@XmlRootElement
public class AmountResponse {
    private int etat;
    private double montant;
    // getter and setters omitted
}

你最终会得到第一种类型的 SOAP 消息。

但是,如果您将响应类更改为如下所示:
@XmlRootElement(namespace = "http://ws.dsi.otn.com/dab")
@XmlAccessorType(XmlAccessType.NONE)
public class AmountResponse {

    @XmlElement(namespace = "http://ws.dsi.otn.com/dab")
    private int etat;

    @XmlElement(namespace = "http://ws.dsi.otn.com/dab")
    private double montant;

    // getters and setter omitted
}

您将把所有标签都放在同一个命名空间中,并且您会得到与您想要的新型消息等效的东西。我说等价是因为我认为你不会得到这个:
<GetAmountResponse xmlns="http://ws.dsi.otn.com/dab">
     <etat>0</etat>
     <montant>500.0</montant>
</GetAmountResponse>

更有可能得到这样的东西:
<ns2:getAmountResponse xmlns:ns2="http://ws.dsi.otn.com/dab">
     <ns2:etat>0</ns2:etat>
     <ns2:montant>500.0</ns2:montant>
</ns2:getAmountResponse>

尽管它们看起来不一样,但它们的“XML 含义”是相同的。

如果你绝对希望它看起来像那样,我认为你将不得不去“低级”并使用类似 a SOAP handler to intercept the response and modify it 的东西。 .但请注意,在消息上线之前更改消息并非易事。

关于web-services - 使用 JAX-WS 修改 Web 服务的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14140583/

相关文章:

java - src/main/resources 文件被 src/test/resources 覆盖

java - 当 XSD 元素没有定义类型(类型 ur-type)但 SOAP 响应中返回子类型时,Axis2 会失败?

web-services - Netbeans基本Http身份验证Jax-WS

java - 即使 Apache CXF 存在依赖性,也使用 JAX-WS stub

java - 访问 JAX-WS SOAP 处理程序中的 Web 方法参数?

r - 唯一标识 VM 实例(Azure ML - Web 服务)

java - 在 PHP 中制作 Web 服务以向 Java 提供信息

python - Python 中的授权 REST 服务

java - JAX-WS SOAP 请求正文参数的 JAXB 绑定(bind)

web-services - WSDL 中定义的多端口服务