java - 将信息从应用程序传递到处理程序级 SOAP

标签 java soap handler

我正在使用 SOAP Web 服务,我需要将信息从应用程序级别(我的主要客户端类)传递到客户端处理程序级别以进行进一步评估。我在下面列出了我的客户和我的客户处理程序。我想扫描来自用户的值并将其存储在位于处理程序中的“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 是一种方法,但我不确定从哪里开始。

最佳答案

你是对的,使用 MessageContext 是一种将信息从客户端实现传递到处理程序的方法。方法如下:

1) 向客户端类添加

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

2) 然后到处理程序

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

仅此而已。

关于java - 将信息从应用程序传递到处理程序级 SOAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360863/

相关文章:

java - 问题 : I want to delete directory from my maven project when i am running mvn eclipse:clean

java - 用于生产和 LTS 的 OpenJDK?

java - C++中new运算符和java中new运算符的区别

java - 使用通用类类型实例化 DynamoDBQueryExpression

android - Android 中的处理程序与异步调用

java - Soap 消息级安全性

php - 看似随机的 SoapFault : not a valid method

java - 第一次尝试后发送 SOAP NullPointerException 和 "Depth limit reached"

java - postDelayed 有时无法在 Android 中运行

javascript - hapi 在发送响应之前设置 header