3

JSFアノテーション@ListenerForは、GlassFishまたはTomcatでは機能しません。エラーや警告はありません。メソッドprocessEvent()を呼び出さないだけです。

@ListenersFor({@ListenerFor(systemEventClass=PostConstructApplicationEvent.class), 
public class MySystemEventListener implements SystemEventListener {

   @Override
   public void processEvent(SystemEvent event) throws AbortProcessingException {
      if(event instanceof PostConstructApplicationEvent){
         System.out.println("*********************************************");
         System.out.println("processEvent Method is Called: PostConstructApplicationEvent");
         System.out.println("*********************************************");
      }

      if(event instanceof PreDestroyApplicationEvent){
         System.out.println("*********************************************");
         System.out.println("processEvent Method is Called: PreDestroyApplicationEvent");
         System.out.println("*********************************************");
      }
}

   @Override
   public boolean isListenerForSource(Object o) {
      return (o instanceof Application);
   }

}

のアイデアで?

4

1 に答える 1

5

そのjavadocが示すように、は、スタンドアロンの実装ではなく、 orの実装@ListenerForに配置することを意図しています。後者の場合は、のように登録する必要があります。UIComponentRendererSystemEventListener<system-event-listener>faces-config.xml

例えば

<application>
    <system-event-listener>
        <system-event-listener-class>com.example.MySystemEventListener</system-event-listener-class>
        <system-event-class>javax.faces.event.PostConstructApplicationEvent</system-event-class>
        <system-event-class>javax.faces.event.PreDestroyApplicationEvent</system-event-class>
    <system-event-listener>
</application>

特定の機能要件については、代わりに積極的に初期化されたアプリケーション スコープ Bean の使用を検討することをお勧めします。これはいくぶん簡単で、詳細な XML は必要ありません。

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

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

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

}
于 2012-04-30T18:53:02.100 に答える