Cyb*_*zly 10 jsf scope instantiation code-injection
可能我的问题很简单,但我之前从未使用过应用程序范围bean.我需要应用程序bean,因为我必须花时间在数据库上进行事务处理.我的搜索根本不能满足我的好奇心.我不知道为什么,但我没有设法初始化bean(它是null)或应用程序崩溃.所以我有一个应用程序范围bean
@ManagedBean(eager=true)
@ApplicationScoped
public class ApplicationContainer {
...
}
Run Code Online (Sandbox Code Playgroud)
eager = true我读过,告诉JSF每次启动应用程序服务器(我使用GlassFish)时都会启动bean.
我在几个地方读过,我只需要把这个注释和bean初始化.对我来说它不...我读了之后如果我想将应用程序bean注入另一个bean我必须使用@PostConstuct注释
@ManagedBean
@SessionScoped
public class TestsBean implements Serializable {
private static final long serialVersionUID = 1L;
@ManagedProperty(value = "#{container}")
private ApplicationContainer container;
@PostConstruct
public void init() {
container.contructContainer();
}
Run Code Online (Sandbox Code Playgroud)
这给我将其注入TestsBean的其他bean中的错误...
请告诉我处理应用程序bean的正确方法.我真的很困惑......
谢谢大家的时间!
Bal*_*usC 26
有2个潜在的错误.
首先,@ManagedBean(eager=true)正如其javadoc所说,这些工作仅适用于应用程序作用域的JSF托管bean.所以它只适用于你使用过@ApplicationScoped的javax.faces.bean包(因此不是javax.enterprise.context包!).这eager=true基本上意味着bean将在webapp的启动时自动实例化,而不是仅在以后第一次在EL中引用时才实例化.
其次,根据Javabeans规范,托管bean名称默认为decapitalized形式的类名.您没有明确指定任何托管bean名称@ManagedBean(name="container", eager=true),因此托管bean名称将默认为applicationContainer,但是您仍然尝试引用它#{container}而不是#{applicationContainer}.
你根本不清楚你面临的问题/错误.如果您遇到异常,您应该完全阅读/解释它,如果您无法理解它,请将其完整地复制 - 包括问题中的堆栈跟踪.它代表了你自己问题的全部答案.你只需要解释和理解它(或者我们只需要用外行的术语解释它).你真的不应该忽视它们,并将它们排除在外,就好像它们是无关的装饰一样.他们不是!
总而言之,完整而正确的方法将是完整的导入声明,以确保,还有一些穷人的stdout打印用于调试:
package com.example;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
@ManagedBean(eager=true)
@ApplicationScoped
public class ApplicationContainer {
public ApplicationContainer() {
System.out.println("ApplicationContainer constructed");
}
}
Run Code Online (Sandbox Code Playgroud)
package com.example;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class TestsBean implements Serializable {
@ManagedProperty("#{applicationContainer}")
private ApplicationContainer container;
public TestsBean() {
System.out.println("TestsBean constructed");
}
@PostConstruct
public void init() {
System.out.println("ApplicationContainer injected: " + container);
}
public void setContainer(ApplicationContainer container) {
this.container = container;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18936 次 |
| 最近记录: |