2013-01-05 17 views
9

おそらく私の質問は些細なものですが、アプリケーションスコープBeanを使用したことはありません。アプリケーションBeanが必要なのは、データベースで時間がかかるトランザクションを実行する必要があるためです。 私の検索は私の好奇心を全く満足させませんでした。 私は理由はわかりませんが、Beanを初期化することはできませんでした(nullです)。または、アプリケーションがクラッシュしました。 だから私は、アプリケーションスコープbeanJSFアプリケーションスコープのインスタンス化とインジェクション

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 
... 
} 

真=熱心を持っている私は豆にアプリケーションサーバーが(私はGlassFishのを使用)起動されるたびに開始するためにJSFに指示します読んで。

私はちょうどこの注釈を配置する必要がありますし、Beanが初期化されるいくつかの場所でお読みください。 私にとっては、私は別のBeanへのアプリケーションBeanを注入したい場合、私は@PostConstuctアノテーションを使用する必要があること

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @ManagedProperty(value = "#{container}") 
    private ApplicationContainer container; 

    @PostConstruct 
    public void init() { 
    container.contructContainer(); 
    } 

を読んだ後、これは私が注入他のBean内のエラーを与える... ありません...

  • サーバが起動するときにアプリケーションBeanが初期化されると、アプリケーションBeanの本体でどのようなメソッドが呼び出されて、必要なアクションを実行するのですか?または、注入されたBeanではポスト構築メソッドで行われますか?

私のアプリケーション豆を処理するための適切な方法を教えてください。私は本当に混乱しています...

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

答えて

21

2つの可能性のある間違いがあります。 its javadocとして

まず、@ManagedBean(eager=true)作品は、アプリケーションがJSF管理対象Beanをスコープだけに、と言います。したがって、@ApplicationScopedjavax.faces.beanパッケージを使用した場合にのみ動作します(したがって、javax.enterprise.contextパッケージではありません)。 eager=trueは基本的に、Beanが最初にELで参照されるときだけでなく、webappの起動時に自動的にインスタンス化されることを意味します。

第二に、管理対象Bean名はデフォルトで小文字に形式のクラス名にJavaBeans仕様に応じました。マネージドBean名がapplicationContainerにデフォルト設定されますので、明示的にただし、まだあなたはまだ#{container}の代わり#{applicationContainer}としてそれを参照しようとしている、@ManagedBean(name="container", eager=true)のような任意の管理対象Bean名を指定していませんでした。

あなたが直面しているすべての問題/エラーで明らかにされていません。例外が発生している場合は、絶対にそれを読んだり解釈したりする必要があります。理解できない場合は、そのスタックトレースを含めて完全にコピーしてください。それは、あなた自身の問題に対する答え全体を表しています。あなたはただそれを解釈して理解する必要があります(または単にそれを説明する必要があります)。あなたは本当にそれらを無視して、彼らが無関係の装飾であるかのように質問から離れるべきではありません。ではない!

すべてのすべてで、完全かつ適切なアプローチは、import宣言念のために、また、デバッグのためのいくつかの貧乏人の標準出力プリントを完備し、次のようになります。

package com.example; 

import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 

    public ApplicationContainer() { 
     System.out.println("ApplicationContainer constructed"); 
    } 

} 
package com.example; 

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    @ManagedProperty("#{applicationContainer}") 
    private ApplicationContainer container; 

    public TestsBean() { 
     System.out.println("TestsBean constructed"); 
    } 

    @PostConstruct 
    public void init() { 
     System.out.println("ApplicationContainer injected: " + container); 
    } 

    public void setContainer(ApplicationContainer container) { 
     this.container = container; 
    } 

} 
+0

はあなたのためにあなたにBalusCありがとう十分な答え。 私は一般的な質問ではなく、特定の質問になりたいので、質問に私の例外を入れていません。 私は、アプリケーションスコープのBeanは、より具体的な、異なる初期化を必要としていると思っていました。残りの部分は適切な初期化を見つけられませんでした。 お返事ありがとうございます。 – CyberGriZzly

関連する問題