18

GlassFish3.0でJSF2.0を使用しています。

私は次のマネージドBeanを持っています:

@ManagedBean
@RequestScoped
public class OverviewController{

    private List<Event> eventList;

    @PostConstruct
    public void init(){
        System.out.println("=> OverviewController - init() - enter");

        System.out.println("=< OverviewController - init() - exit");
    }
}

overview.xhtmlファイルから、OverviewControllerからさまざまな属性またはメソッドを呼び出しています。

<ui:repeat var="event" value="#{overviewController.eventList}">
    ...
</ui:repeat>

すべてが正常に機能しますが、問題はログファイルにあります。

INFO: Enter : RESTORE_VIEW 1
INFO: Exit : RESTORE_VIEW 1

INFO: Enter : RENDER_RESPONSE 6
INFO: => OverviewController - init() - enter
INFO: => Overview Controller - updateSelectedTab() - enter
INFO: =< Overview Controller - updateSelectedTab() - exit
INFO: =< OverviewController - init() - exit
INFO: => OverviewController - init() - enter
INFO: => Overview Controller - updateSelectedTab() - enter
INFO: =< Overview Controller - updateSelectedTab() - exit
INFO: =< OverviewController - init() - exit
INFO: Exit : RENDER_RESPONSE 6

ご覧のとおり、init()メソッドは、理由もなく同じリクエストで2回呼び出されます。私の知る限り、PostConstructで注釈が付けられたメソッドは、リクエストごとに1回呼び出されます。私が間違っている?

編集: ページでAJAXは使用されていません。ファイアバグでリクエスト数を確認しました。行われたツリーリクエストがあります:

  • 1.javax.faces.resource (GET)用に1つ
  • 2.cssファイル用に1つ(GET)
  • 3.overview.xhtml用の1つ(GET)
4

2 に答える 2

22

これは、同じBeanクラスを管理する複数のフレームワークがある場合に発生する可能性があります。たとえば、JSFCDI、またはJSFSpring、CDISpringなど。Beanの構成とアノテーションを再確認します。

これは、CDIを使用して@Namedいて、クラス全体で複数のアノテーションを使用している場合にも発生する可能性があります。たとえば@Named、クラスをストレートしてマネージドBeanとして登録し、別のクラスを@Producesgetterメソッドに登録します。それが本当に必要かどうかを自問する必要があります。#{bean.someObject}の代わりに使用することもできます#{someObject}

@Named
@RequestScoped
public class Bean {

    @PostConstruct
    public void init() {
        // ...
    }

    @Named
    @Produces
    public SomeObject getSomeObject() {
        // ...
    }

}

これは、マネージドBeanがメソッドをオンにする抽象クラスを拡張する場合にも発生する可能性があります@PostConstruct。注釈を削除する必要があります。または、initメソッドを抽象化し、実装Beanに持たないようにする必要があります。@PostConstruct

public abstract class BaseBean {

    @PostConstruct
    public void postConstruct() {
        init();
    }

    public abstract void init();

}
于 2012-01-31T12:13:24.447 に答える
2

init()メソッドと@PostConstructメソッドの両方が起動し、この動作を引き起こしている可能性があります。init()メソッドの名前を変更したり、名前を付けたりしてみてくださいprivate。これはあなたの問題に関連していると思います:

http://javahowto.blogspot.com/2011/07/servlet-init-method-vs-postconstruct.html

また、JSFライフサイクルのデバッグに関する良い投稿をここで見つけました: JSFライフサイクルのデバッグ

于 2012-01-31T10:50:37.730 に答える