如何拦截SOAP消息并在处理之前对其进行转换?

时间:2016-06-11 17:30:23

标签: java web-services xslt soap transform

我有需要转换自定义SOAP消息的任务。一开始我必须得到这个自定义SOAP消息,然后我需要使用XSLT转换此消息,然后在我的WebService中处理此消息。重复相反的过程。

我有转换SOAP消息的XSLT文件和方法,但我不知道在哪里需要调用此方法进行转换。如何拦截SOAP消息以及我必须在哪里执行此操作?因为我只有一个方法的课程(下面的例子),我不明白如何在webservice中处理之前转换这个消息。

@WebService
public class Calculator {

public String showCard(final CreditCard creditCard) {
    return creditCard.toString();
}

}

以下是technical mapping我需要做的事情。

1 个答案:

答案 0 :(得分:0)

  

如何拦截SOAP消息以及我必须在哪里执行此操作?

您需要SoapHandler在执行端点的业务逻辑之前捕获soap请求,并使用其他SoapHandler来转换出站响应。

定义SoapHandler类(从mkyong中提取的示例)

public class CalculatorSoapHandler implements SOAPHandler<SOAPMessageContext>{

   @Override
   public boolean handleMessage(SOAPMessageContext context) {

    Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    //for response message only, true for outbound messages, false for inbound
    if(!isRequest){

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

        //process....

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

    }

      //continue other handler chain
      return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
    }

    @Override
    public void close(MessageContext context) {
    }

    @Override
    public Set<QName> getHeaders() {
    }


}

创建soap处理程序XML文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains 
     xmlns:javaee="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <javaee:handler-chain>
    <javaee:handler>
      <javaee:handler-class>com.CalculatorSoapHandler</javaee:handler-class>
    </javaee:handler>
  </javaee:handler-chain>
</javaee:handler-chains>

使用@HandlerChain

将SOAP处理程序附加到Web服务
@WebService
@HandlerChain(file="handler-chain.xml")
public class Calculator {

如果您使用像CXF或spring-WS这样的jax-ws框架,请查看文档以查看具体配置