2017-02-03 15 views
0

私は、SOAPクライアントとしてApache Axisを使用してSpringとの統合を設定しました。ログの軸クライアント要求と応答Spring Beanを使用して

私は、ハンドラーをSpringコンテキストの外にあるクラスとして構成するために、client-config.wsddをセットアップすることができます。私がしたいのは、ハンドラがスプリングコンテキスト内になるようにハンドラを設定することです。これは可能でしょうか?ここで

client-config.wsdd

<?xml version="1.0" encoding="UTF-8"?> 
<deployment name="defaultClientConfig" 
      xmlns="http://xml.apache.org/axis/wsdd/" 
      xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 

    <handler name="log" type="java:xxx.xxx.handler.SOAPLogHandler"> 
    </handler> 

    <globalConfiguration> 
     <parameter name="disablePrettyXML" value="false"/> 
     <requestFlow> 
      <handler type="log"/> 
     </requestFlow> 
     <responseFlow> 
      <handler type="log"/> 
     </responseFlow> 
    </globalConfiguration> 

    <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/> 
</deployment> 

私の現在である私はまた、春に登録されているサービスがあります。私は直接AxisクライアントのハンドラとしてのSpring Beanを使用する方法を探していた

<bean id="wsYPSoap" class="xxx.xxx.core.ws.WsYPSoapProxy"> 
    <constructor-arg value="${xxx.service.url}" /> 
</bean> 

答えて

0

をし、リクエスト/レスポンスの詳細をログに記録する目的のためです。

現在のところ、これを行うには簡単で簡単な方法はないようです。

しかし、Axisハンドラからアプリケーションルートコンテキストを介してSpring Beanにアクセスする方法があります。いくつかの問題がここにあります:彼らは、単純なクラス(いない豆)として必要なとき

  • のAxisハンドラは

  • は、ハンドラのインスタンスがどのサーブレットの存在(または、すなわち顔に頼ることはできません
  • インスタンス化されています)そのinvoke()メソッドはこのため

と呼ばれた時点でコンテキストは、ルートアプリケーションコンテキストであなたのSpring Beanを配置する必要があります。問題は、通常の方法(つまりServletContextFacesContext)でアプリケーションコンテキストにアクセスできないことです。この問題を回避するには、独自のApplicationContextAware Beanを作成して、Axisハンドラで使用するためのアプリ起動時にルートアプリケーションコンテキストへの参照を格納する必要があります。

最小ApplicationContextAware Bean実装例:

public class ApplicationContextProvider implements ApplicationContextAware { 
    private static ApplicationContext rootAppContext; 

    @Override 
    public void setApplicationContext(ApplicationContext ctx) throws BeansException { 
     rootAppContext = ctx; 
    } 

    public static ApplicationContext getApplicationContext() { 
     return rootAppContext; 
    } 
} 

application-context.xmlでは、Beanを宣言する:

<bean id="appContextProvider" lazy-init="false" class="package.where.the.class.is.ApplicationContextProvider" /> 

注意宣言でlazy-init="false"これは重要あります。このBeanはどこにも参照されていない(または自動配線されていない)ため、SpringはBeanの作成に遅延戦略を使用するため、Springのインスタンスを作成しません。 lazy-initをfalseに設定すると、アプリケーションの起動時にBeanが作成されます。

ApplicationContext ctx = ApplicationContextProvider.getApplicationContext(); 
if (ctx != null) { 
    DBLogBean bean = (DBLogBean) ctx.getBean("yourDBLogBeanId"); 
    if(bean != null) { 
     bean.doLogOrSomething(); 
    } 
} 

ご確認してください:あなたは(DBLogBeanクラスによって実装された)あなたのDBのログBeanが適切に設定され、春によって作成/ロードしている、あなたはすなわち、このように軸のハンドラでそれにアクセスできることを提供

コンテキストからDB Beanを取得する前に、ApplicationContextProvider.getApplicationContext()nullかどうかを確認してください。今すぐctx.getBean()nullを返すかどうか確認する必要があります。

これは(枢軸ハンドラが呼び出されるたびに、すなわち何らかの理由であなたがDB Beanを持っている必要があります)オプションではありません場合は、Beanが作成されたApplicationContextProvider後のAxisハンドラがしかと呼ばれていることを確認する必要があります。そのトピックは、しかし、ここでは範囲外である。)

注:lazy-init="false"を使用してBeanの作成Beanインスタンスを作成する 好ましい方法ではありません。 Beansは 以外のbean/codeによって自動配線/参照され、 のライフサイクルを管理するためにSpringに残されている必要があります。たとえば、Beanの作成を強制的に行う弱点の1つは、起動時に が作成されていることを確認することができず、別の手順で処理しない限り利用できなくなります(または 他のコードしかし、なぜ、最初に lazy-init="false"を使用するのですか?)。

関連する問題