如何通过Java在每个SOAP响应/请求中添加/读取自定义标头

3
我需要在SOAP响应中添加自定义头,并从SOAP请求中读取头信息。目前我参考了以下链接link1link2,做出如下修改。 Web Service类:
import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService()
@HandlerChain(name = "SoapHandler", file = "soaphandler.xml")
public class FooService {

    @WebMethod()
    public String sayHello(String name) {
        System.out.println("Hello: " + name);
        return "Hello " + name + "!";
    }
}

SOAP处理程序类:

package com.webservice;

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

public class SoapHandler implements SOAPHandler<SOAPMessageContext> {

    private static final Logger LOGGER = Logger.getLogger(SoapHandler.class.getName());

    @Override
    public void close(MessageContext arg0) {
        System.out.println("Colse Method");
        LOGGER.info("Close Method");
    }

    @Override
    public boolean handleFault(SOAPMessageContext arg0) {
        System.out.println("handleFault Method");
        LOGGER.info("handleFault Method");
        return false;
    }

    @Override
    public boolean handleMessage(SOAPMessageContext arg0) {
        System.out.println("handleMessage Method");
        LOGGER.info("handleMessage Method");
        return false;
    }

    @Override
    public Set<QName> getHeaders() {
        System.out.println("getHeaders Method");
        LOGGER.info("getHeaders Method");
        return null;
    }
}

Tester Class

public class Tester {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            FooServiceServiceLocator locator = new FooServiceServiceLocator();
            FooService fooService = locator.getFooServicePort();
            System.out.println(fooService.sayHello("ashish"));
        } catch (ServiceException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

处理程序链配置:

<?xml version="1.0" encoding="UTF-8"?>
<jws:handler-chains xmlns:jws="http://java.sun.com/xml/ns/javaee">
  <jws:handler-chain>
    <jws:handler>
      <jws:handler-name>SoapHandler</jws:handler-name>
      <jws:handler-class>com.webservice.SoapHandler</jws:handler-class>
    </jws:handler>
  </jws:handler-chain>
</jws:handler-chains>

当我调用这个Tester类时,它会正确地输出"Hello ashish!",并且我的handleMessage(SOAPMessageContext arg0)方法在请求进来和出去时都被执行了,那么我该如何区分传入的请求和传出的响应呢?
handleMessage(SOAPMessageContext arg0) method ? so that when request comes in I can read Header and when response goes out then I can Add my header into it Thanks....

你已经配置了处理程序链吗? - Balaji Krishnan
@balaji krishnan 是的,我已经按照Link2中提供的方式配置了处理程序链,并且我的SOAP处理程序正在工作,但是当请求进来和出去时,handleMessage()方法会执行两次,现在的问题是如何区分传入的请求和传出的响应? - Ashish Jagtap
1个回答

2

使用在handleMessage中获取的上下文参数

arg0.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

并检查返回的布尔值以识别消息是否为请求/响应


我正在使用你提到的相同代码:Object bOutbound = messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 这意味着当它返回Boolean.TRUE值时,它是响应,而当返回Boolean.FALSE时,它是请求,是这样吗? - Ashish Jagtap
是的,你说得对。javadoc在这里:http://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/MessageContext.html#MESSAGE_OUTBOUND_PROPERTY - Balaji Krishnan
嘿,谢谢,这对我有用,但还有一件事,我如何在Handler Chain配置中排除某些方法?例如,假设FooService类中还有一个名为sayHey()的方法,我想将此方法从SoapHandler类中排除。 - Ashish Jagtap
我认为你做不到那个。那些方法是在SOAPHandler和SOAPMessageContext接口中定义的。虽然这不是建议的方式,但也许你可以创建另一个类来覆盖所有方法,在你需要的类中只需扩展它并重写getMessage方法。像往常一样,对于接口,你需要以某种方式提供实现。 - Balaji Krishnan
你可以在服务器端和客户端实现处理程序。如果您要在所有请求标头中包含某些内容,请在客户端处理程序中执行此操作,并在服务器端处理程序中提取标头内容并进行验证,就像我们在Web应用程序中使用的过滤器一样。 - Balaji Krishnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接