@PostConstruct方法针对同一请求两次调用

我正在使用带有GlassFish 3.0的JSF 2.0。

我有以下托管豆:

@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()方法在同一请求中被两次调用,无缘无故。据我所知,每个带有 PostConstruct 注释的方法都会被调用一次。我错了吗?

页面上未使用AJAX。我用萤火虫检查了请求的数量。有树请求:

  • 1.一个用于javax.faces.resource (GET)
  • 2.一个用于css文件 (GET)
  • 3.一个概述.xhtml (GET)

回答:

如果您有多个框架管理同一个bean类,则会发生这种情况。例如,JSF CDI,或JSF Spring,或CDI

Spring等。仔细检查您在Bean上的配置和注释。

如果您使用的是CDI,并且在@Named整个类中使用了多个注释,那么也会发生这种情况。例如,@Named直接在类上将其注册为托管Bean,在类上使用@Producesgetter方法注册另一个。您需要问自己是否

真的 必要。您也可以使用#{bean.someObject}代替#{someObject}

@Named

@RequestScoped

public class Bean {

@PostConstruct

public void init() {

// ...

}

@Named

@Produces

public SomeObject getSomeObject() {

// ...

}

}

如果您的托管bean扩展了一些抽象类,而该抽象类又具有@PostConstructon方法,那么也会发生这种情况。您应该从中删除注释。另外,你应该让init方法抽象的,

具有@PostConstruct对实现bean:

public abstract class BaseBean {

@PostConstruct

public void postConstruct() {

init();

}

public abstract void init();

}

以上是 @PostConstruct方法针对同一请求两次调用 的全部内容, 来源链接: utcz.com/qa/402789.html

回到顶部