Spring JAX-WS-使用Custom HandlerResolver添加动态头

时间:2013-10-25 22:38:37

标签: java spring web-services soap jax-ws

我使用这样的弹簧配置来添加CustomHandler。它工作正常。根据{{​​3}} - 每个代理调用一次customHandlerResolver

这就是问题所在。我需要为每个SOAP请求添加一个动态安全令牌头,因为处理程序只被调用一次,我的令牌在一定时间后到期,我无法设置刷新令牌。

   <bean id="myServicePort" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
        <property name="serviceInterface" value="org.my.myService" />
        <property name="wsdlDocumentUrl" value="classpath:wsdl/mysoap.wsdl" />
        <property name="namespaceUri" value="http://services.mycom.org" />
        <property name="serviceName" value="OrderService" />
        <property name="endpointAddress" ref="OrderEndPoint" />
        <property name="handlerResolver" ref="customHandlerResolver"/>
   </bean>

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用bean范围原型。

<bean id="myServicePort" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean" scope="prototype">
    <property name="serviceInterface" value="org.my.myService" />
    <property name="wsdlDocumentUrl" value="classpath:wsdl/mysoap.wsdl" />
    <property name="namespaceUri" value="http://services.mycom.org" />
    <property name="serviceName" value="OrderService" />
    <property name="endpointAddress" ref="OrderEndPoint" />
    <property name="handlerResolver" ref="customHandlerResolver"/>

答案 1 :(得分:0)

正如我所说,HandlerResolver只被调用一次,无论bean的范围是什么。我使用了CXF - org.apache.cxf.jaxws.JaxWsProxyFactoryBean,因为我可以更好地控制bean的创建,不像上面的Spring代理,Spring自己创建了代理。

 <bean id="proxyFactory"
    class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
    <property name="serviceClass" value="org.my.myService"/>
    <property name="address" value="http://localhost:9002/HelloWorld"/>
  </bean>

在我的客户端代码中

//Set a handler 
proxyFactory.setHandlers( Arrays.asList((Handler) new TokenHandler(Token)));
OrderService orderServicePort=  (myService) proxyFactory.create();

//Call service method, as SOAP message has desired dynamic header
orderServicePort.getXXX()

这完全可行,并且比我的初始配置

更简洁