1

プラットフォーム:
JSF (モハラ) 2.1.14

PostConstructApplicationEvent を使用してアプリケーション スコープのマネージド Bean を初期化しようとしています。これは、必要なビルド ツールが Java 5 を使用してコンパイルされるため、@PostConstruct アノテーションを使用しないという重要な制約があるためです。このために、これに SystemEventListener インターフェースを実装しました。クラス

public class ApplicationListener implements SystemEventListener {

    private final static Logger LOGGER = Logger
            .getLogger(ApplicationListener.class.getName());

    public boolean isListenerForSource(Object app) {
        boolean isApp = (app instanceof Application);  
        return isApp;
    }

    public void processEvent(SystemEvent event) throws AbortProcessingException {
         try {
        if (event instanceof PostConstructApplicationEvent) {
             Application app = ((PostConstructApplicationEvent) event).getApplication();
             LOGGER.info("PostConstructApplicationEvent is Called");
             FacesContext context = FacesContext.getCurrentInstance();
            MyBean myBean = ((PostConstructApplicationEvent) event).getApplication().evaluateExpressionGet(context,"#{myBean}", MyBean.class);
             myBean.init();
         } catch (Exception e) {
             FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error while initiliazing app bean", e.getMessage());
             LOGGER.error("Error while initiliazing app bean", e);
         }
        }
    }
}  

問題は、これらの例外が発生していることです。

2012-12-14 12:19:48,822 INFO [ApplicationListener] - PostConstructApplicationEvent is Called
14/12/2012 12:19:48 PM com.sun.faces.config.ConfigureListener contextInitialized
GRAVE: Critical error during deployment: 
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! null
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:376)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:223)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
    at com.sun.faces.application.ApplicationImpl.evaluateExpressionGet(ApplicationImpl.java:426)
    at com.myproject.event.ApplicationListener.processEvent(ApplicationListener.java:39)
    at javax.faces.event.SystemEvent.processListener(SystemEvent.java:106)
    at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2169)
    at com.sun.faces.application.ApplicationImpl.invokeListenersFor(ApplicationImpl.java:2145)
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:303)
    at com.sun.faces.config.ConfigManager.publishPostConfigEvent(ConfigManager.java:601)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:370)
    ... 11 more
14/12/2012 12:19:48 PM org.apache.catalina.core.StandardContext listenerStart
GRAVE: Excepción enviando evento inicializado de contexto a instancia de escuchador de clase com.sun.faces.config.ConfigureListener
java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! null
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:290)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! null
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:376)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:223)
    ... 10 more
Caused by: java.lang.NullPointerException
    at com.sun.faces.application.ApplicationImpl.evaluateExpressionGet(ApplicationImpl.java:426)
    at com.myproject.event.ApplicationListener.processEvent(ApplicationListener.java:39)
    at javax.faces.event.SystemEvent.processListener(SystemEvent.java:106)
    at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2169)
    at com.sun.faces.application.ApplicationImpl.invokeListenersFor(ApplicationImpl.java:2145)
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:303)
    at com.sun.faces.config.ConfigManager.publishPostConfigEvent(ConfigManager.java:601)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:370)
    ... 11 more
14/12/2012 12:19:48 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: Error listenerStart
14/12/2012 12:19:48 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: Falló en arranque del Contexto [/calibre] debido a errores previos
14/12/2012 12:19:48 PM javax.faces.FactoryFinder$FactoryManager getFactory
GRAVE: La aplicación no se ha inicializado correctamente durante el inicio, no se encuentra la fábrica: javax.faces.application.ApplicationFactory. Attempting to find backup.
14/12/2012 12:19:48 PM com.sun.faces.config.ConfigureListener contextDestroyed
GRAVE: Unexpected exception when attempting to tear down the Mojarra runtime
java.lang.IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory. 
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1010)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:342)
    at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:136)
    at com.sun.faces.config.ConfigureListener.contextDestroyed(ConfigureListener.java:328)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4831)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5478)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)

さて、私が問題を理解し始めたのは、ELContext が InitFacesContext から解放されたため、getELContext() メソッドを呼び出そうとすると NullPointerException がスローされることです。

だから私の質問は、ここで何が間違っているのですか? PostConstructApplicationEvent 中にプログラムで管理された Bean を取得するべきではありませんか? もしそうなら、なぜですか?

この問題に光を当てるための助けを前もって感謝します。

4

1 に答える 1

2

現在扱っているスタック トレースについては説明できませんが、

  1. J2SE 5 はアノテーションをサポートしています。実際、それらは 5 で導入されました。

  2. JSFは、@ApplicationScopedBeanが起動時にインスタンス化されるようにする単純な注釈パラメーターを使用して、ユースケース(Beanのイーガーロード)に対応していると言えます。eager=true次のように @ManagedBean アノテーションに追加します

      @ManagedBean(eager=true)
    

仕事を成し遂げるために

于 2012-12-15T17:47:19.683 に答える