2015-05-28 2 views
3

Я пытаюсь получить доступ к запросу и ответу SOAP через клиентскую сторону, чтобы я мог рассчитать время выполнения для каждого вызова. Для этого я реализовал SOAPHandler, но метод handleMessage не вызывается (точка останова не попадает или журнал не регистрируется). Я использую wsimport для создания классов/заглушек на стороне клиента, а также передачи файла привязки в качестве параметра для команды wsimport.JAX-WS handleMessage в SOAPHandler не набирается

Это то, что я сделал до сих пор:

Мой связывающую файл - обработчик-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; 
    } 
} 

Когда вебсервис вызывается метод handleMessage не получает вызывается на всех. Любая идея?
Я использую JAX-WS RI 2.2.4-b01 для создания заглушек.

ответ

2

Решение было найдено по этому вопросу, но для ответа на вопрос я должен предоставить больше информации об этом проекте.

Этот проект использует Spring MVC с JaxWsPortProxyFactoryBean для реализации сервисного интерфейса JAX WS.

Поскольку цель состоит в том, чтобы все вызовы SOAP использовали «LoggingSOAPHandler», тогда «LoggingSOAPHandler» должен быть введен в JaxWsPortProxyFactoryBean через HandlerResolver. Я создал реализацию HandlerResolver ....

CustomHandlerResolver:

public class CustomHandlerResolver implements HandlerResolver { 


    /** 
    * Overrode in order to load custom handlers. 
    * @see javax.xml.ws.handler.HandlerResolver#getHandlerChain(javax.xml.ws.handler.PortInfo) 
    */ 
    public List<Handler> getHandlerChain(PortInfo portInfo) { 
     List<Handler> handlerChain = new ArrayList<Handler>(); 
     LoggingSOAPHandler hh = new LoggingSOAPHandler(); 
     handlerChain.add(hh); 
     return handlerChain; 
    } 
} 

Я добавил hanlderResolver боб и инъекции в файл конфигурации XML Service:

 <beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:context="http://www.springframework.org/schema/context" 
       xmlns:mvc="http://www.springframework.org/schema/mvc" 
       xmlns:aop="http://www.springframework.org/schema/aop"  
       xmlns:tx="http://www.springframework.org/schema/tx" 
       xmlns:util="http://www.springframework.org/schema/util" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.0.xsd 
       http://www.springframework.org/schema/mvc 
       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
       http://www.springframework.org/schema/util 
       http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 

       <!-- Use custom HandlerResolver that loads a list of custom SOAP handlers --> 
       <bean id="CustomHandlerResolver" class="com.ws.handler.CustomHandlerResolver"/> 

       <bean id="registrationService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"> 
       <property name="lookupServiceOnStartup" value="false" /> 
       <property name="serviceName"   value="TestService" /> 
       <property name="serviceInterface"  value="com.ws.registration.TestService" /> 
       <property name="wsdlDocumentUrl"  value="${registration.service}?wsdl" /> 
       <property name="namespaceUri"   value="${registration.namespace}" /> 
       <property name="endpointAddress"  value="${registration.service}" /> 
       <property name="username"    value="${registration.username}"/> 
       <property name="password"    value="${registration.password}"/> 
       <property name="customProperties"  ref="jaxwsCustomProperties" /> 
       <property name="handlerResolver"  ref="CustomHandlerResolver"/> 
       </bean> 

     .......  
    </beans> 

Так, так как распознаватель обработчик впрыскивается в JaxWsPortProxyFactoryBean обработчики, указанные в классе CustomHandlerResolver, вводятся во время выполнения.