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

我正在使用带有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。
我用 Firebug 检查了请求的数量。有树请求:

  • 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,那么也会发生这种情况。您应该从中删除注释。另外,您应该使init方法变得抽象,并且在实现的bean上没有@PostConstruct:

    public abstract class BaseBean {
    
        @PostConstruct
        public void postConstruct() {
            init();
        }
    
        public abstract void init();
    
    }
    

    JSF:清除会话范围的Bean - java

    我想知道,在用户关闭JSF 1.2上的窗口(点击浏览器的“ X”)后,如何在JSF中执行session.remove("userBean")。我当时想在用户点击浏览器的“ X”后弹出一个确认消息,但我不太确定如何访问Ok按钮或将其绑定到我定义的方法上,在这里我有逻辑来清除作用域中的bean。还是有更好的方法呢?任何帮助将不胜感激。谢谢。 …

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

    JAVA:字节码和二进制有什么区别? - java

    java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

    java:继承 - java

    有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

    Java:BigInteger,如何通过OutputStream编写它 - java

    我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…