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にありetat、 と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;
    }

次のような応答クラスを使用します。

@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 の意味" は同じです。

絶対にそのように見せたい場合は、「低レベル」になり、SOAPハンドラーのようなものを使用して応答を傍受して変更する必要があると思います. ただし、メッセージが送信される前に変更するのは簡単なことではないことに注意してください。

于 2013-01-03T17:11:21.060 に答える
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);
    }
}
于 2013-01-06T21:32:28.537 に答える
0
于 2021-03-24T14:56:19.220 に答える