首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >同一请求调用两次@PostConstruct方法

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

Stack Overflow用户
提问于 2012-01-31 18:28:05
回答 2查看 28.8K关注 0票数 17

我使用的是JSF2.0和GlassFish 3.0。

我有以下托管Bean:

代码语言:javascript
复制
@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");
    }
}

在我的OverviewController中,我从overview.xhtml文件调用了不同的属性或方法。

代码语言:javascript
复制
<ui:repeat var="event" value="#{overviewController.eventList}">
    ...
</ui:repeat>

一切正常,但问题出在日志文件上:

代码语言:javascript
复制
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。我用firebug检查了请求的数量。存在树请求:

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-31 20:13:24

如果您有多个框架管理同一个bean类,就会发生这种情况。例如,JSF和CDI,或者JSF和Spring,或者CDI和Spring,等等。仔细检查bean上的配置和注释。

如果您正在使用CDI并在整个类中使用多个@Named注释,也会发生这种情况。例如,一个@Named直接在类上注册为托管bean,另一个在@Produces getter方法上。你需要问问自己,这是否真的有必要。您也可以直接使用#{bean.someObject}而不是#{someObject}

代码语言:javascript
复制
@Named
@RequestScoped
public class Bean {

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

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

}

如果您的托管bean扩展了一些抽象类,那么也可能发生这种情况,而抽象类又在方法上有一个@PostConstruct。您应该删除其中的注释。或者,您应该使初始化方法成为抽象的,并且在实现bean上没有@PostConstruct

代码语言:javascript
复制
public abstract class BaseBean {

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

    public abstract void init();

}
票数 22
EN

Stack Overflow用户

发布于 2012-01-31 18:50:38

可能是init()方法和@PostConstruct方法都在触发并导致此行为。尝试更改init()方法的名称和/或将其放入private。我认为这可能与你的问题有关:

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

我还在这里找到了一篇关于调试JSF生命周期的好文章:Debug JSF lifecycle

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9077966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档