0

xmlで定義されたリモートWebサービス用に次のSpringBeanがあります。

    <bean id="authWSTemplate" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean" abstract="true">
       <property name="serviceInterface" value="com.example.webservices.Authentication" />
       <property name="wsdlDocumentUrl" value="${ws.root}/authentication?wsdl" />
       <property name="namespaceUri" value="http://security.webservices.example.com/" />
       <property name="serviceName" value="AuthenticationWebService" />
       <property name="portName" value="AuthenticationPort" />
       <property name="maintainSession" value="true" />
    </bean>

このBeanテンプレートを取得して、具象Beanを作成するにはどうすればよいですか(つまり、ルートプロパティを指定します)?次に、コンクリート豆をSpringコンテナに入れることはできますか?

さまざまなシステムを指す多数の具象Beanが必要なので、ルート値も異なります。この例では、ルートを持つ2つのシステムがあるとします:http://domain1.com: 8001/ wshttp://domain2.com:8002/ws

したがって、「authWSdom1」と「authWSdom2」という2つのBeanが必要です。

これをアプリケーション初期化ブロックでプログラム的に実行することを期待しています。ここでは、すべての既知のシステム実装のリストを取得し(この情報は実行時にのみ認識されます)、各implのBeanを作成し、Bean名をキャッシュしてから、私のアプリケーションは、必要に応じてSpringコンテナから適切なBeanを取得します。

または、これのためのより良いパターンはありますか?おそらく、Beanのコンストラクターでルート値を提供することによってですか?

複数のエンドポイント間での同時アクセスをサポートする必要があるため(つまり、複数のユーザーが同時にdomain1とdomain2にアクセスする)、Springで単一のBeanを使用することはできないと考えています。

4

2 に答える 2

1

BeanFactoryPostProcessorとInitializingBeanを実装するカスタムBeanを作成します。postProcessBeanFactoryメソッドを使用してBeanを作成します。

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
    String wsdlDocumentUrl = ....;
    // .......
    registry.registerBeanDefinition(YOUR_BEAN_NAME, BeanDefinitionBuilder.childBeanDefinition(
                getParentNoDomainServicBeanName(authWSTemplate)).addPropertyReference(
                "wsdlDocumentUrl", wsdlDocumentUrl).getBeanDefinition());

}
于 2012-11-19T19:11:36.867 に答える
0

SpringコンテナでBeanを動的に作成する場合は、Ragnorの答えが適していると思いますが、Springを使用して独自のWSTemplate DTOを定義し、ファクトリクラスを使用してこのDTOを使用し、プログラムでビルドすることにしました(実行時に提供されるルートURLおよびDTOサフィックス値が追加されます)、結果のJaxWSProxyBeanをキャッシュします。

<bean id="authWSTemplate" class="com.example.WSProxyTemplate">
   <property name="serviceInterface" value="com.example.webservices.Authentication" />
   <property name="wsdlDocumentUrlSuffix" value="/authentication?wsdl" />
   <property name="namespaceUri" value="http://security.webservices.example.com/" />
   <property name="serviceName" value="AuthenticationWebService" />
   <property name="portName" value="AuthenticationPort" />
   <property name="maintainSession" value="true" />
</bean>

私のSpring構成は、実際に使用されているWS Beanから抽象化されているため、このアプローチが気に入っています。つまり、JaxWS以外のものを使用したい場合は、同じDTOBeanを使用する別のファクトリを作成するだけです。繰り返しますが、これは、いくつかのシステム/環境基準に応じて実行時にWS実装を選択する必要がある場合に役立ちます。

于 2012-12-05T10:55:46.777 に答える