2013-01-03 81 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); 
    } 
}