当前位置: 首页 > 知识库问答 >
问题:

未调用SOAPHandler中的JAX-WS handleMessage

公冶昆杰
2023-03-14

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

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

<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>
  <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>
@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
{
    ...
}
<?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个答案

壤驷华美
2023-03-14

为这个问题找到了一个解决方案,但是为了回答这个问题,我必须提供关于这个项目的更多上下文。

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

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

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;
    }
}
        <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类中指定的处理程序是在运行时注入的。

 类似资料:
  • 我正在尝试实现一个CORS响应过滤器,以允许来自我的JavaScript前端的跨域引用。我使用的是Resteasy附带的< code > wildly 10.0 . final ,如果我理解正确的话,它是< code>JAX-RS 2.0的补充。 EDIT:将@Provider添加到CorsResponseFilter中,并作为一个单独的元素添加到RestServiceConfig中。 我需要做什

  • 为了实现上面的逻辑,我需要客户机发送他的监听器信息和请求(基本上是URI)。这是在处理完请求后,将请求状态更新到客户端。 使用JAX-RS处理长时间运行的操作

  • 问题内容: 实例化ArrayAdapter时,我收到以下警告(编译正常): 这是问题所在: 有人对它为什么给我这个警告有任何想法吗? 问题答案: 这是因为希望您指定它将处理的对象类型。因此,为了避免这些警告,请执行以下操作:

  • 问题内容: 我正在尝试通过将它们添加到和中,并在中找到单独的重复项和非重复项 在本月底,我希望是和是,因为有2个额外的实例和1 。但是,运行此命令后,它们都为空。 永远不会调用提供给该流的lambda,我通过尝试在内部打印进行验证: 当我尝试与任何一个一起使用时,这将不起作用。我究竟做错了什么? 注意:可能还有其他与此类似的问题,但是我正在寻找一种规范的答案,以说明这种问题为什么不适用于Java

  • 问题内容: 我试图绘制一个简单的矩形,但我认为paintComponent方法没有被调用。这是带有main方法的类的代码: 和带有paintComponent()的类 这是什么问题,我不知道… 问题答案: 虽然已经提供的答案可能会导致出现矩形,但这种方法并非最佳。此示例旨在显示一种更好的方法。阅读代码中的注释以获取详细信息。 请注意,应该在EDT上启动Swing / AWT GUI。这留给读者练习

  • 我的怀疑是 > 为什么要调用webservice,而不是使用? 可以用来调用此webservice吗