SOAPHandler中的JAX-WS handleMessage没有被调用

时间:2015-05-28 17:56:39

标签: web-services soap jaxb jax-ws wsimport

我正在尝试通过客户端访问SOAP请求和响应,以便我可以计算每次调用的执行时间。我已经实现了SOAPHandler来实现这一点,但是没有调用handleMessage方法(断点没有被命中或没有记录日志)。我正在使用wsimport创建客户端类/存根,并将绑定文件作为参数传递给wsimport命令。

这是我到目前为止所做的:

我的绑定文件 - handler-chain.xml

<jaxws:bindings
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb">
    <handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
        <handler-chain>
            <handler>
                <handler-name>LoggingSOAPHandler</handler-name>
                <handler-class>com.handler.LoggingSOAPHandler</handler-class>
            </handler>
        </handler-chain>
    </handler-chains>    
</jaxws:bindings>

wsimport命令:

  <property name="package"       value="com.ws"/>
  <property name="src"           value="docroot/WEB-INF/src"/>
  <property name="classes"       value="docroot/WEB-INF/classes"/>
  <property name="bindingfile"   value="docroot/WEB-INF/src/com/handler/handler-chain.xml"/>
    <target name="wsimport">
        <exec executable="${jdk.home}/bin/wsimport">
          <arg line="-keep -s ${src} -p ${package} -d ${classes} -b ${bindingfile} ${wsdl}"/>
        </exec>
      </target>

当我在wsimport命令上面运行时,会创建所有存根,并将@HandlerChain注释添加到存根服务类中,如下所示:

@WebServiceClient(name = "TestService", targetNamespace = "http://webservice.com/", wsdlLocation = "http://test:8290/TEST/services/test?wsdl")
@HandlerChain(file = "TestService_Service_handler.xml")
public class TestService_Service
    extends Service
{
    ...
}

这是生成的TestService_Service_handler.xml:

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

这是我的SOAPHandler

public class LoggingSOAPHandler implements SOAPHandler<SOAPMessageContext> {

    private static Logger _logger = LoggerFactory.getLogger(LoggingSOAPHandler.class);

    @Override
    public boolean handleMessage(SOAPMessageContext messageContext) {

        Boolean outboundProperty = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        if (outboundProperty.booleanValue()) {
            _logger.info("\nOutbound message:");
        } else {
            _logger.info("\nInbound message:");
        }
        return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        _logger.info("Client : handleFault()......");
        return false;
    }

    @Override
    public void close(MessageContext context) {
        _logger.info("Client : close()......");

    }

    @Override
    public Set<QName> getHeaders() {
        _logger.info("Client : getHeaders()......");
        return null;
    }
}

调用webservice时,根本不会调用handleMessage方法。 有什么想法?
我正在使用JAX-WS RI 2.2.4-b01来生成存根。

1 个答案:

答案 0 :(得分:2)

找到了这个问题的解决方案,但要回答这个问题,我必须提供更多关于这个项目的背景信息。

该项目使用Spring MVC和JaxWsPortProxyFactoryBean来实现JAX WS服务接口。

由于目标是让所有SOAP调用都使用'LoggingSOAPHandler',因此必须通过HandlerResolver将'LoggingSOAPHandler'注入JaxWsPortProxyFactoryBean。我创建了一个HandlerResolver实现....

CustomHandlerResolver:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ http://client.qa.example.com/?param=$1 [R=301,QSA,L]

我将hanlderResolver bean和注入添加到服务xml配置文件中:

cflow

因为处理程序解析器被注入到JaxWsPortProxyFactoryBean中,所以在运行时会注入CustomHandlerResolver类中指定的处理程序。