2011-02-09 14 views
2

私はeclipse axis2を使用してwsdlからWebサービスクライアントを作成しています。axis2 Webサービスのサーバーリクエストとしてjsf beanを取得します

私のimplの方法は次のとおりです。

public Output[] startProcess(Message[] Messages){ 
    MyApplicationBean managementBean = (MyApplicationBean) FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get("myapp"); 
... 
} 

しかし、私は実行すると:

http://localhost:8080/MyProject/services/portStartProcessService方法startProcess

で、私はしかしFacesContext.getCurrentInstance()戻りをnull、それは私の方法に到達したTomcatのデバッグ中に参照してください。私は、Webサービスの呼び出しに(アプリケーションスコープなど)JSF Beanを使用するにはどうすればよい

私のweb.xml(その一部)

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
    <url-pattern>/services/*</url-pattern> 
    </servlet-mapping> 
<servlet-mapping> 
    <servlet-name>AxisServlet</servlet-name> 
    <url-pattern>/servlet/AxisServlet</url-pattern> 
    </servlet-mapping> 

答えて

2

あなたはこれをまだ聞いて欲しくないと知っていますが、アーキテクチャが間違っています。ユーザーセッションで

  • 、または:非表示のフォームフィールドに
  • JSFの全体的なアイデアは、GUIを保存ステートフルなコンポーネントで構築されているということですので、JSFアプリケーションコンテキストは、Webサービスの呼び出しで無用です。

JSFは、Webサービス呼び出しでセッションもフォームも使用できないため、ここでは適用されません。 JButtonを押すWebサービスを作成する方法や、CD-ROMにCDを挿入する方法を尋ねることもできます。

JSFコンポーネントは必要なく、マネージドBeanの内部にあるアプリケーションロジックが必要であると私は理解しています。

最も簡単な解決策は、タイムマシンを手に入れ、プロジェクトが計画された時に戻って、アプリケーションロジックを管理されたビーンに決して投入しないことを建築家に伝えることです。その理由の1つは、Webサービスコールに使用できないことです。アプリケーションロジックは、SpringまたはEJBによって提供されるサービスレイヤーに存在する必要があります。

Spring BeanとEJBの両方は、AxisサービスやマネージドBeanから簡単にアクセスできるため、JSFフロントエンド以外の場所からJSFマネージドBeanにアクセスする必要はありません。 Springが気に入らず、何らかの理由でEJBを使用できない場合は、POJOからサービスレイヤーを構築し、ApplicationContextListenerで設定してアプリケーションスコープに登録します。

きれいなソリューションが利用できないとリファクタリングが不可能な場合は、次の2つの選択肢があります:あなたが到達しようマネージドBeanがアプリケーションスコープと熱望しているならば、彼らはJSPの方法でアクセスすることができ、

  • をvenerable getAttributeメソッドを使用してアプリケーションコンテキストからアクセスすることができます(サーブレットコンテキストを介してアプリケーションコンテキストにアクセスできます。メッセージコンテキストを介してアクセスし、Axisの静的MessageContext.getCurrentMessageContextメソッドでアクセスします)。

  • 使用する管理対象Beanがリクエストスコープであり、JSF配管が必要な場合(自分でインスタンス化できないように)、FacesServletのふりをして自分でfacesコンテキストを作成できます。それはトリッキーですが、実行可能です、良いとかなり有名な説明はここにあります:http://www.thoughtsabout.net/blog/archives/000033.html。servletrequestとservletresponse(MessageContextから)が必要です。 FacesContextを渡すために必要な部分はスキップすることができます。なぜなら、ビューを処理する必要がないからです。

免責事項:私は最後の解決策を試したことがない - それはかなり汚いですが、それが動作しているようです(実際に奇怪であるJSFに依存するようにWebサービスの原因となります)。

+0

非常に良い答え。実際には - JSFアプリケーションスコープBeanを置き換えたい場合、春にこのように定義する方法は、サーバーが起動するとメソッドを呼び出すでしょうか? – Dejell

+1

@Odelya:Webアプリケーションでは、WebApplicationContextのインスタンスが作成され、カスタムApplicationContextListenerに登録されます。これは、すべてのシングルトンBeanが作成されているため、初期化としてマークされたメソッド(または@PostContructで注釈が付けられたメソッド)は、アプリケーションの起動前に実行されます。 – fdreger

関連する問題