2013-01-03 79 views
4

我怎样才能改变这样的响应的命名空间:修改响应

老回应:

<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前缀。

+0

请为我的任务有何回应? –

回答

3

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

在你想要的新消息中,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 
} 

你最终将与第一种类型肥皂信息。

但是,如果你改变响应类看起来像这个:

@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。但请注意,在消息传递之前更改消息并不是一项简单的任务。

0

逻辑处理器足以转化为消息预期:

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); 
    } 
}