- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我将 JSF 2.0 与 GlassFish 3.0 结合使用。
我有以下托管 Bean:
@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 检查了请求数。有树请求:
最佳答案
如果您有多个框架管理同一个 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();
}
关于java - @PostConstruct 方法为同一个请求调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9077966/
我对下面代码的结果有点困惑。 父 Controller : @Controller public abstract class ParentController{ @PostConstruct pub
我有这样的设置: Bean类: private final Map configCache = new HashMap<>(); @PostConstruct private void fillCac
这似乎不正确。我正在清理代码,只是注意到了这一点。每个ajax请求都会触发我的@PostConstruct bean的构造函数和@ViewScoped。即使是简单的数据库分页也会触发它。 我under
根据answer of BalusC ,我用过 FacesContext.getCurrentInstance().getExternalContext().redirect(url); 在我的 @P
我正在使用 Spring 开发一个 Java 小型应用程序,所以我有这个服务: public class AccountService implements UserDetailsService {
问题:entityManager.unwrap(SessionImplementor.class) 导致没有可用的事务实体管理器异常。 代码: @Component public class Hibe
我想使用 @PostConstruct 在我的 web 应用程序中初始化一个 bean,但我无法让它工作。 我已经在新项目中重新创建了该问题,但仍然无法正常工作。 我在这里遗漏了一些明显的东西吗?据我
我在 Java SE 应用程序中使用 CDI (Weld)。我制作了一个 Bean,我们称之为 BeanA。 public class BeanA { @PostConstruct p
在托管 bean 中,@PostConstruct 在常规 Java 对象构造函数之后调用。 为什么我要使用 @PostConstruct 来初始化 bean,而不是常规构造函数本身? 最佳答案 因为
我有 spring bean 类 RedisRepo在里面我正在使用@PostConstruct初始化我的数据库连接: @PostConstruct public void init() {
我使用了当前版本的 Eclipse 和 Java。我尝试将 RCP 应用程序从 Java 8 迁移到 Java 11。我的应用程序可以运行,但现在遇到功能问题,因为我必须从代码中删除 @PostC
由于我是 Java EE 7 的新手,所以我创建了一个项目以供学习之用。我创建了一个具有 Request 范围的 CDI bean,如下所示(它只是实现了 Serializable,因为我已经尝试将它
我有一个计划任务,每晚汇总数据。每当我启动应用程序时该任务就会运行,并且我想在应用程序上运行 jUnit 测试时停止它运行。 @Scheduled(cron = "0 0 0 1 * ?") publ
这个问题已经有答案了: How to get access to javax.annotation.Resource at run time in Java 9 (2 个回答) Java 9 migr
我正在 JBoss 上试验 EJB3,开发无状态 bean。基本上一旦部署了模块,我就需要执行一些与加载应用程序设置相关的操作。为此,我将一个方法注释为@PostConstruct,据我所知,API
假设我们有以下类 public abstract class AbstractFoo { @PostConstruct private void doIt() { //
我的 JEE 应用程序中有 2 个单例,我想在启动时对其进行初始化。像这样: @Singleton @Startup public class ServiceB { @EJB priv
我正在编写 JAX-RS 库(不是应用程序)。 我有: abstract class A { @PostConstruct private void constructed_a() {
假设我在 Spring @Configuration 中有这个依赖: @Bean public SomeClass someClass(SomeClass1 someClass1, SomeClass
我将 JSF 2.0 与 GlassFish 3.0 结合使用。 我有以下托管 Bean: @ManagedBean @RequestScoped public class OverviewContr
我是一名优秀的程序员,十分优秀!