@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 1INFO: 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,在类上使用@Produces
getter方法注册另一个。您需要问自己是否
真的 必要。您也可以使用#{bean.someObject}
代替#{someObject}
。
@Named@RequestScoped
public class Bean {
@PostConstruct
public void init() {
// ...
}
@Named
@Produces
public SomeObject getSomeObject() {
// ...
}
}
如果您的托管bean扩展了一些抽象类,而该抽象类又具有@PostConstruct
on方法,那么也会发生这种情况。您应该从中删除注释。另外,你应该让init方法抽象的,
不 具有@PostConstruct
对实现bean:
public abstract class BaseBean { @PostConstruct
public void postConstruct() {
init();
}
public abstract void init();
}
以上是 @PostConstruct方法针对同一请求两次调用 的全部内容, 来源链接: utcz.com/qa/402789.html