(Java EE 6 和 Glassfish 3.1)
我有一个属性文件,我只想在启动时处理一次,所以我这样做了
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 配置
。我试试这个
@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。
最佳答案
那个@Context
注释仅适用于 JAX-RS Controller ,不适用于 JSF 托管 bean。您必须使用@ManagedProperty
反而。 ServletContext
可通过 ExternalContext#getContext()
获取。 FacesContext
本身可以通过#{facesContext}
获得。
@ManagedProperty(value="#{facesContext.externalContext.context}")
private ServletContext context;
或者因为您将监听器存储为 servletcontext 属性,这与 JSF 应用程序范围基本相同,所以您也可以通过其属性名称将其设置为托管属性:
@ManagedProperty(value="#{config}")
private Config config;
但是由于您使用的是 JSF 2.0,我建议使用 @ApplicationScoped
@ManagedBean
相反,它是急切构建的。与@PostConstruct
和 @PreDestroy
在这样的 bean 中,您对 webapp 的启动和关闭有类似的钩子(Hook),如 ServletContextListener
中那样。 .
@ManagedBean(eager=true)
@ApplicationScoped
public void Config {
@PostConstruct
public void applicationInitialized() {
// ...
}
@PreDestroy
public void applicationDestroyed() {
// ...
}
}
你可以像往常一样将它注入(inject)到另一个bean中@ManagedProperty
方式并以通常的 EL 方式在 View 中访问它。
关于jsf - Java EE 6 : How to inject ServletContext into managed bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6497170/