2011-07-21 9 views
1

私は最近、速い応答のArjenのおかげでproblem of the direct streaming with Spring WSを解決しました。このトリックは、Axiomメッセージファクトリでペイロードキャッシングを無効にすることでした。Spring WSで複数のメッセージファクトリを使用できますか?

私は現在、グローバルな決定に悩まされているため、システム全体のペイロードキャッシングを有効または無効にする必要があります。ストリーミングを使用したWebサービスと、有効化を可能にするもの(ペイロードキャッシュが無効な場合は不可能です)

特定のエンドポイントを特定のメッセージファクトリにマップすることは可能ですか? Webサービスクライアントでは簡単ですが、エンドポイントはどうですか?何か案は?

ありがとうございました!

答えて

2

クライアント側でWebServiceMessageFactoryインスタンスをWebServiceTemplateコンストラクタに渡すのは非常に簡単です。

とにかく、サーバー側でも可能です。 異なるURLマッピングを使用できる場合は、私が見つけた最も簡単な方法は、web.xmlの2つ(またはそれ以上)の異なる設定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> 

次に、さまざまなメッセージファクトリBeanをSpring-Wsコンテキストに追加するだけでよいのです。

これが役に立ちます。

+0

ありがとうございました!また、このソリューションが見つかったので、すべてのWebサービスがストリーミングで利用できるわけではなく、ブロックされていないことを確認するためにこれを少し強化しなければなりませんでした。 – codevour

1

単一のエンドポイント内でmessagefactoryを切り替える場合は、WebServiceMessageReceiverHandlerAdapterを拡張してgetMessageFactoryメソッドをオーバーライドすることで達成できます。今すぐウェブでのinit-PARAMを追加することで、拡張WebServiceMessageReceiverHandlerAdapterを使用するようにMessageDispatcherServletを知らせるあなたはalternateMessageFactory

<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> 

を使用したいalternateMessageFactoryと石鹸アクションを提供することで、あなたのコンテキストファイル内SwitchableMessageRecieverHandlerAdapterを設定

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(); 

    } 

} 

.xml

<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> 
関連する問題