Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们可以在SpringWS中使用多个消息工厂吗?_Java_Spring_Soap_Streaming_Spring Ws - Fatal编程技术网

Java 我们可以在SpringWS中使用多个消息工厂吗?

Java 我们可以在SpringWS中使用多个消息工厂吗?,java,spring,soap,streaming,spring-ws,Java,Spring,Soap,Streaming,Spring Ws,我最近解决了这个问题,多亏了Arjen的快速响应。诀窍是在Axiom消息工厂中禁用有效负载缓存 我现在正受这个全局决策的影响,我们必须为整个系统启用或禁用有效负载缓存。我们希望有具有流的Web服务,以及一些支持验证的Web服务(如果禁用有效负载缓存,这是不可能的) 那么,是否可以将特定端点映射到特定的消息工厂?使用webservice客户端很容易,但是端点呢?有什么想法吗 谢谢大家! 没错,在客户端将特定的WebServiceMessageFactory实例传递给WebServiceTempla

我最近解决了这个问题,多亏了Arjen的快速响应。诀窍是在Axiom消息工厂中禁用有效负载缓存

我现在正受这个全局决策的影响,我们必须为整个系统启用或禁用有效负载缓存。我们希望有具有流的Web服务,以及一些支持验证的Web服务(如果禁用有效负载缓存,这是不可能的)

那么,是否可以将特定端点映射到特定的消息工厂?使用webservice客户端很容易,但是端点呢?有什么想法吗


谢谢大家!

没错,在客户端将特定的
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服务都可用于流媒体,并且被屏蔽。