web-dev-qa-db-ja.com

@PostConstructメソッドが同じリクエストに対して2回呼び出されました

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でリクエストの数を確認しました。ツリーリクエストが行われました:

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

これは、同じ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();

}
21
BalusC

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

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

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

1
MrKiane