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回呼び出されます。私が間違っている?
EDIT:いいえAJAXがページで使用されています。firebugでリクエストの数を確認しました。ツリーリクエストが行われました:
これは、同じBeanクラスを管理する複数のフレームワークがある場合に発生する可能性があります。例えば。 JSF and CDI、またはJSF and Spring、またはCDI and Springなど。Beanの構成とアノテーションを再確認してください。
これは、CDIを使用していて、クラス全体で複数の@Named
アノテーションを使用している場合にも発生する可能性があります。たとえば、クラスを直接@Named
してマネージドBeanとして登録し、別のクラスを@Produces
ゲッターメソッドに登録します。それが本当に必要かどうかを自問する必要があります。 #{bean.someObject}
の代わりに#{someObject}
を使用することもできます。
@Named
@RequestScoped
public class Bean {
@PostConstruct
public void init() {
// ...
}
@Named
@Produces
public SomeObject getSomeObject() {
// ...
}
}
これは、マネージドBeanが、メソッドに@PostConstruct
も持つ抽象クラスを拡張する場合にも発生する可能性があります。注釈を削除する必要があります。または、initメソッドを抽象化し、not実装Beanに@PostConstruct
を設定する必要があります。
public abstract class BaseBean {
@PostConstruct
public void postConstruct() {
init();
}
public abstract void init();
}
init()
メソッドと_@PostConstruct
_メソッドの両方が起動し、この動作を引き起こしている可能性があります。 init()
メソッドの名前を変更するか、private
を付けてみてください。これはあなたの問題に関連しているかもしれないと思います:
http://javahowto.blogspot.com/2011/07/servlet-init-method-vs-postconstruct.html
また、JSFライフサイクルのデバッグに関する良い投稿をここで見つけました: JSFライフサイクルのデバッグ