Java 我们可以在SpringWS中使用多个消息工厂吗?
我最近解决了这个问题,多亏了Arjen的快速响应。诀窍是在Axiom消息工厂中禁用有效负载缓存 我现在正受这个全局决策的影响,我们必须为整个系统启用或禁用有效负载缓存。我们希望有具有流的Web服务,以及一些支持验证的Web服务(如果禁用有效负载缓存,这是不可能的) 那么,是否可以将特定端点映射到特定的消息工厂?使用webservice客户端很容易,但是端点呢?有什么想法吗Java 我们可以在SpringWS中使用多个消息工厂吗?,java,spring,soap,streaming,spring-ws,Java,Spring,Soap,Streaming,Spring Ws,我最近解决了这个问题,多亏了Arjen的快速响应。诀窍是在Axiom消息工厂中禁用有效负载缓存 我现在正受这个全局决策的影响,我们必须为整个系统启用或禁用有效负载缓存。我们希望有具有流的Web服务,以及一些支持验证的Web服务(如果禁用有效负载缓存,这是不可能的) 那么,是否可以将特定端点映射到特定的消息工厂?使用webservice客户端很容易,但是端点呢?有什么想法吗 谢谢大家! 没错,在客户端将特定的WebServiceMessageFactory实例传递给WebServiceTempla
谢谢大家! 没错,在客户端将特定的
WebServiceMessageFactory
实例传递给WebServiceTemplate
构造函数非常容易
无论如何,我想在服务器端也是可能的。
如果您可以使用不同的url映射,我发现最简单的方法是在web.xml
中配置两个(或更多)不同的MessageDispatcherServlet
。然后,只需将您喜欢的WebServiceMessageFactory
实例的特定bean名称作为init参数传递。大概是这样的:
<servlet>
<servlet-name>ws1</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/ws1-servlet.xml</param-value>
</init-param>
<init-param>
<param-name>messageFactoryBeanName</param-name>
<param-value>defaultMessageFactory</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>ws2</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/ws2-servlet.xml</param-value>
</init-param>
<init-param>
<param-name>messageFactoryBeanName</param-name>
<param-value>streamingMessageFactory</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ws1</servlet-name>
<url-pattern>/ws1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ws2</servlet-name>
<url-pattern>/ws2</url-pattern>
</servlet-mapping>
ws1
org.springframework.ws.transport.http.MessageDispatcherServlet
上下文配置位置
/WEB-INF/conf/ws1-servlet.xml
messageFactoryBeanName
defaultMessageFactory
ws2
org.springframework.ws.transport.http.MessageDispatcherServlet
上下文配置位置
/WEB-INF/conf/ws2-servlet.xml
messageFactoryBeanName
流线型信息工厂
ws1
/ws1
ws2
/ws2
然后,您只需将不同的消息工厂bean添加到SpringWS上下文中
希望这有帮助。如果您想在单个端点内切换messagefactory,可以通过扩展
WebServiceMessageReceiverHandlerAdapter
并重写getMessageFactory
方法来实现
public class SwitchableMessageRecieverHandlerAdapter extends WebServiceMessageReceiverHandlerAdapter{
private WebServiceMessageFactory alternateMessageFactory;
private String switchOn;
public void setSwitchOn(String switchOn) {
this.switchOn = switchOn;
}
public String getSwitchOn() {
return switchOn;
}
public WebServiceMessageFactory getAlternateMessageFactory() {
return alternateMessageFactory;
}
public void setAlternateMessageFactory(WebServiceMessageFactory alternateMessageFactory) {
this.alternateMessageFactory = alternateMessageFactory;
}
public void afterPropertiesSet() throws Exception {
Assert.notNull(alternateMessageFactory, "alternateMessageFactory is required");
Assert.notNull(switchOn, "switchOn parameter is required");
}
@Override
public WebServiceMessageFactory getMessageFactory() {
TransportContext transport = TransportContextHolder.getTransportContext();
if(transport!=null && transport.getConnection() instanceof HttpServletConnection){
HttpServletConnection httpCon = (HttpServletConnection)(transport.getConnection());
if(getSwitchOn().equals(httpCon.getHttpServletRequest().getHeader("soapAction"))){
return alternateMessageFactory;
}
}
return super.getMessageFactory();
}
}
现在,通过提供alternateMessageFactory
和要使用alternateMessageFactory
的soap操作,在上下文文件中配置SwitchableMessageReceiveHandlerAdapter
<bean id="messageFactory" class="org.springframework.ws.samples.mtom.service.AxiomMtomEnabledSoapMessageFactory">
<property name="payloadCaching" value="true"/>
<property name="attachmentCaching" value="true"/>
</bean>
<bean id="saajMessageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>
<bean id="switchableMessageReciever" class="SwitchableMessageRecieverHandlerAdapter">
<property name="alternateMessageFactory" ref="saajMessageFactory"/>
<property name="switchOn" value="LoadImage"/>
</bean>
现在,通过在web.xml中添加init参数,通知MessageDispatcherServlet使用扩展的WebServiceMessageReceiverHandlerAdapter
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>messageReceiverHandlerAdapterBeanName</param-name>
<param-value>switchableMessageReciever</param-value>
</init-param>
</servlet>
春季天气预报
org.springframework.ws.transport.http.MessageDispatcherServlet
转换wsdllocations
真的
messageReceiverHandlerAdapterBeanName
可切换消息接收器
非常感谢!我们还发现了这个解决方案,我们必须对此进行一点增强,以确保并非所有的web服务都可用于流媒体,并且被屏蔽。