2011-06-27 8 views
3

(Glassfishの3.1でJava EE 6)のJava EE 6:どのように管理Bean

へのServletContextを注入するために、私は私がスタートアップ時に一度だけ処理するプロパティファイルを持っているので、私はこの

をしました
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で、私は今、私は男からConfigRecord configへのアクセス方法

<listener> 
    <listener-class>com.wf.docsys.core.servlet.Config</listener-class> 
</listener> 

に従うとして登録高齢の豆。私はこれを試してください

@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

答えて

10

@Context注釈はJAX-RSのコントローラにのみ適用されていること、ではないJSF管理対象Beanインチあなたは代わりに@ManagedPropertyを使用する必要があります。 ServletContextExternalContext#getContext()によって提供されています。 FacesContext自体は#{facesContext}によって提供されています。

@ManagedProperty(value="#{facesContext.externalContext.context}") 
private ServletContext context; 

それとも、基本的にはJSFアプリケーションのスコープと同じであるのServletContext属性としてリスナーを格納しているため、あなたはまた、単にその属性名で管理プロパティとして設定できます。

@ManagedProperty(value="#{config}") 
private Config config; 

をあなたはJSF 2.0にしているので、しかし、私は熱心に構築される代わりに@ApplicationScoped@ManagedBeanを使用することをお勧めしたいです。そのような豆で@PostConstruct@PreDestroyを使用すると、ServletContextListenerのように、Webアプリケーションの起動とシャットダウンに類似したフックを持っています。

@ManagedBean(eager=true) 
@ApplicationScoped 
public void Config { 

    @PostConstruct 
    public void applicationInitialized() { 
     // ... 
    } 

    @PreDestroy 
    public void applicationDestroyed() { 
     // ... 
    } 

} 

あなたは他の豆に通常の@ManagedProperty方法でそれを注入し、ビューで通常のELの方法でそれにアクセスすることができます。

関連する問題