(使用Glassfish 3.1的Java EE 6)
我有一个属性文件,我想在启动时只处理一次,所以我做了这个
public class Config implements ServletContextListener{
private static final String CONFIG_FILE_PATH = "C:\\dev\\harry\\core.cfg";
private static final String CONFIG_ATTRIBUTE_NAME = "config";
private long startupTime;
private ConfigRecord config;
@Override
public void contextInitialized(ServletContextEvent sce) {
this.startupTime = System.currentTimeMillis() / 1000;
this.config = new ConfigRecord(CONFIG_FILE_PATH); //Parse the property file
sce.getServletContext().setAttribute(CONFIG_ATTRIBUTE_NAME, this);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//Nothing to do here
}
public ConfigRecord getConfig() {
return config;
}
public long getStartupTime() {
return startupTime;
}
}
并在web.xml
中,我将其注册为
<listener>
<listener-class>com.wf.docsys.core.servlet.Config</listener-class>
</listener>
现在如何从托管bean访问ConfigRecord config
。我试试这个
@ManagedBean
@RequestScoped
public class DisplayInbound {
@EJB
private CoreMainEJBLocal coreMainEJBLocal;
@javax.ws.rs.core.Context
private ServletContext servletContext;
public void test(){
Config config = (Config) servletContext.getAttribute("config")
ConfigRecord configRecord = config.getConfig();
}
}
我觉得它不起作用。得到NullPointerException
。
答案 0 :(得分:11)
@Context
注释仅适用于JAX-RS控制器,而不适用于JSF托管bean。您必须使用@ManagedProperty
代替。 ServletContext
可以ExternalContext#getContext()
使用FacesContext
。 #{facesContext}
本身可由@ManagedProperty(value="#{facesContext.externalContext.context}")
private ServletContext context;
提供。
@ManagedProperty(value="#{config}")
private Config config;
或者因为您将侦听器存储为servletcontext属性(与JSF应用程序范围基本相同),您还可以通过其属性名称将其设置为托管属性:
@ManagedBean(eager=true)
@ApplicationScoped
public void Config {
@PostConstruct
public void applicationInitialized() {
// ...
}
@PreDestroy
public void applicationDestroyed() {
// ...
}
}
但是既然你使用的是JSF 2.0,我建议使用@ApplicationScoped
@ManagedBean
来代替,这是一个热切构造的。在这样的bean中使用@PostConstruct
和@PreDestroy
,您在webapp的启动和关闭时具有与ServletContextListener
中类似的挂钩。
{{1}}
您可以使用通常的@ManagedProperty
方式将其注入另一个bean中,并以通常的EL方式在视图中访问它。