2012-04-28 5 views
2

SOAP 웹 서비스를 사용하고 있으며 추가 평가를 위해 주 클라이언트 클래스 인 응용 프로그램 수준의 정보를 클라이언트 처리기 수준으로 전달해야합니다. 내 클라이언트 및 클라이언트 처리기 아래 나열했습니다. 나는 텍스트 노드를 SOAPHeader에 추가 할 수 있도록 처리기에있는 "discountVal"변수에 사용자 및 저장소의 값을 스캔하려고합니다.응용 프로그램에서 처리기 수준으로 정보 전달 SOAP

CLIENT :

/* 
* 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; 
     } 
    } 
} 

클라이언트 HANDLER

/* 
* 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를 사용하는 것이이 일을 할 수있는 방법이라고 생각하지만, 어디에서 시작해야하는지 확신 할 수 없다.

답변

5

당신이 맞습니다. MessageContext를 사용하면 클라이언트 구현에서 처리기로 정보를 전달할 수 있습니다. 클라이언트 클래스에

1)

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

2) 다음

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

를 핸들러에 추가 그리고 그게 다야 : 그 방법은.

관련 문제