当前位置: 首页 > 面试题库 >

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

孔波
2023-03-14
问题内容

我正在使用带有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();

}


 类似资料:
  • 我遇到了一个奇怪的问题。对于单个HTTP请求,我的servlet的doGet方法被多次调用。每隔10-12秒重新运行一次,直到初始过程完成。 下面是我的servlet代码 下面是web.xml中的映射 我使用的是SEAM和JSF,但这是一个独立的servlet。日志中也没有例外。我还验证了INIT方法只被调用一次。重复的是服务方法。所有重新运行的标识哈希代码都是相同的(System.Identit

  • 问题内容: 我想我在这里描述的可能有个名字,但我不知道。所以我的第一个问题是要知道这种技术的名称。 这是一个示例:假设您正在网页上实现实时搜索。每次用户在搜索框中键入内容时,您都会触发一个新的搜索查询,并且结果会尽可能频繁地更新。这是一件愚蠢的事情,因为您发送的查询会超出实际需要。每2-3个字母发送一次请求,或者每100 ms最多发送一次请求就足够了。 因此,一种技术是安排在键入键之后立即执行的查

  • 问题内容: SampleBean: 和配置文件是这样的: 而且我没有在bean标记上设置default-init-method属性。 任何机构都可以说出为什么@PostConstruct方法没有被调用的原因。 问题答案: 你需要(或)启用处理功能。

  • Spring 4.1和Spring Security 3.2:我们实现了一个自定义身份验证提供程序,如果用户输入了错误的密码,它会抛出一个Bad凭据异常。当抛出Bad凭据异常时,将调用ProviderManager.authenticate方法,该方法将再次调用自定义身份验证中的身份验证方法。当抛出LockedException时,不会再次调用自定义身份验证提供程序中的Authenate方法。我们

  • 假设我们有两个类A、B和各自类的同步方法methodA、methodB。如果我们从synchronizedmethodA调用synchronized methodB,那么当methodB仍在执行时,线程是否仍对ObjectA保持锁定?

  • 问题内容: 这些天,我正在学习JSF + Facelets。我有一个BackingBean和Facelet xHTML页面。当我请求facelet页时(仅一次),backing-bean-method被多次调用。 这可能是什么原因? 我看不到什么特别的东西。提前致谢。 这是方面: 这是支持豆。方法getKunden被多次调用: 问题答案: Bean的getter在那里就 可以 从视图侧 访问 模型