jsf - Java EE 6 : How to inject ServletContext into managed bean

标签 jsf jakarta-ee java-ee-6 servlets

(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/

相关文章:

Java 对象转换为整数和字符串包装器

jsp - 你能把一个 WebFilter 打包成一个库吗

javascript - 单击按钮时滚动到对话框内的组件

jsf - AccordionPanel 不呈现最后一个选项卡

java - UML、Java 和 ArrayList

java - 在 Java EE 应用程序中使用 groovy?

java - Java 中的 Restful Web 应用程序(安全性)

java - ejb-jar.xml 环境条目枚举

JSF 复合库名称和子文件夹

java - 如何在 JSF 2 的值表达式和方法表达式中传递参数?