2

私は SOAP Web サービスを使用しており、詳細な評価のために、メイン クライアント クラスであるアプリケーション レベルからクライアント ハンドラ レベルに情報を渡す必要があります。クライアントとクライアント ハンドラーを以下にリストしました。ユーザーからの値をスキャンして、Handler にある "discountVal" 変数に格納し、テキスト ノードを SOAPHeader に追加できるようにしたいと考えています。

クライアント:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;

/**
 *
 * @author Jack
 */
public class Client 
{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

       client.ItemPriceServiceService service = new client.ItemPriceServiceService();
       service.setHandlerResolver(new ClientHandlerResolver());
       client.ItemPriceService port = service.getItemPriceServicePort();




       String discount = "25";


       Scanner scan = new Scanner(System.in);  
       String item = scan.next();
       while(!item.equals("bye"))
       {
        double price = getPrice(item);

        System.out.println(price);

        item = scan.next();
       }
       if(item.equals("bye"))
       {
           System.exit(0);
       }
    }

    private static double getPrice(java.lang.String arg0) {
        client.ItemPriceServiceService service = new client.ItemPriceServiceService();
        client.ItemPriceService port = service.getItemPriceServicePort();
        return port.getPrice(arg0);
    }

    private static class ClientHandlerResolver implements HandlerResolver {

        public ClientHandlerResolver() {
        }

        @Override
        public List<Handler> getHandlerChain(PortInfo portInfo) {

            List<Handler> hchain = new ArrayList<Handler>();
            hchain.add(new clientHandler());
            return hchain;
        }
    }
}

クライアントハンドラー

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;



import java.util.Collections;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.*;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

/**
 *
 * @author Jack
 */
public class clientHandler implements SOAPHandler<SOAPMessageContext> {

     public boolean handleMessage(SOAPMessageContext context) 
     {
    Boolean outgoing = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
       if(outgoing){

    try{
        SOAPMessage soapMsg = context.getMessage();
            SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
            SOAPHeader soapHeader = soapEnv.getHeader();

            if (soapHeader == null){
                soapHeader = soapEnv.addHeader();
            }


            //get discount value FROM CLIENT
            String discountVal = "25";


            QName qname = new QName("http://testOne", "discount");
            SOAPHeaderElement soapHeaderElement = soapHeader.addHeaderElement(qname);

            soapHeaderElement.setActor(SOAPConstants.URI_SOAP_ACTOR_NEXT);
            soapHeaderElement.addTextNode(discountVal);
            soapMsg.saveChanges();

       }catch(SOAPException e){
        System.err.println(e);
       }

         }

       //continue other handler chain
       return true;
   }

    public Set<QName> getHeaders() {
        return Collections.EMPTY_SET;
    }

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

    public void close(MessageContext context) {
    }
}

どんな助けでも大歓迎です!MessageContext を使用することがこれを行う方法になると感じていますが、どこから始めればよいかわかりません。

4

1 に答える 1

6

そうです、MessageContextを使用することは、クライアントの実装からハンドラーに情報を渡す方法です。方法は次のとおりです。

1)クライアントクラスに追加

((BindingProvider)port).getRequestContext().put("discountID", discount);

2)次にハンドラーに

if(context.containsKey("discountID")){
     discountVal = context.get("discountID");
}

そしてそれがすべてです。

于 2013-01-20T17:45:46.607 に答える