5

如何修改响应的命名空间,如下所示:

旧回应:

<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 命名空间前缀。

4

3 回答 3

3

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

在您想要的新消息中GetAmountResponseetatmontant都在 namespace 中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
}

你最终会得到第一种肥皂信息。

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

@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 含义”相同,尽管它们看起来不一样。

如果您绝对希望它看起来像那样,我认为您将不得不去“低级”并使用诸如SOAP 处理程序之类的东西来拦截响应并对其进行修改。但请注意,在消息上线之前更改消息并非易事。

于 2013-01-03T17:11:21.060 回答
0

logical handler are enough to transform to the message as expected :

package com.ouertani.slim;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.LogicalMessage;
import javax.xml.ws.handler.LogicalHandler;
import javax.xml.ws.handler.LogicalMessageContext;
import javax.xml.ws.handler.MessageContext;

/**
 *
 * @author ouertani
 */
public class MyLogicalHandler implements LogicalHandler<LogicalMessageContext> {

    @Override
    public boolean handleMessage(LogicalMessageContext messageContext) {
        /// extract state and amount
        int state = 0;
        double amount = 200.0;
        transform(messageContext, state, amount);
        return false;
    }

    public boolean handleFault(LogicalMessageContext messageContext) {
        return true;
    }

    public void close(MessageContext context) {
    }
    private void transform( LogicalMessageContext messageContext, int etat, double montant){
            LogicalMessage msg = messageContext.getMessage();

        String htom = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
   "<soap:Body>"+
      "<GetAmountResponse xmlns=\"http://ws.dsi.otn.com/dab\">"+
         "<etat>"+etat+"</etat>"+
         "<montant>"+montant+"</montant>"+
      "</GetAmountResponse>"+
   "</soap:Body>"+
"</soap:Envelope>";
        InputStream is = new ByteArrayInputStream(htom.getBytes());
        Source ht = new StreamSource(is);
        msg.setPayload(ht);
    }
}
于 2013-01-06T21:32:28.537 回答
0
于 2021-03-24T14:56:19.220 回答