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

Med*_*tem 5 soap web-services 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>
Run Code Online (Sandbox Code Playgroud)

想要的新回复:

<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>
Run Code Online (Sandbox Code Playgroud)

我想删除 ns2 namespce 前缀。

Bog*_*dan 3

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

在您想要的新消息中,GetAmountResponseetatmontant都位于名称空间 中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;
    }
Run Code Online (Sandbox Code Playgroud)

具有这样的响应类:

@XmlRootElement
public class AmountResponse {
    private int etat;
    private double montant;
    // getter and setters omitted
}
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您将响应类更改为如下所示:

@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
}
Run Code Online (Sandbox Code Playgroud)

您将把所有标签放在同一个命名空间中,并且您会得到与您想要的新消息类型等效的内容。我说等价是因为我认为你不会完全明白这一点:

<GetAmountResponse xmlns="http://ws.dsi.otn.com/dab">
     <etat>0</etat>
     <montant>500.0</montant>
</GetAmountResponse>
Run Code Online (Sandbox Code Playgroud)

相反,更有可能得到这样的东西:

<ns2:getAmountResponse xmlns:ns2="http://ws.dsi.otn.com/dab">
     <ns2:etat>0</ns2:etat>
     <ns2:montant>500.0</ns2:montant>
</ns2:getAmountResponse>
Run Code Online (Sandbox Code Playgroud)

两条消息的“XML 含义”相同,尽管它们看起来不一样。

如果您绝对希望它看起来像那样,我认为您必须进入“低级别”并使用SOAP 处理程序之类的东西来拦截响应并修改它。但请注意,在发送消息之前更改消息并不是一项简单的任务。