Не работает аннотация JSF @ListenerFor/@ListenersFor
Аннотация 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);
}
}
С идеей?
1 ответ
Решение
Как говорит его Javadoc, @ListenerFor
намеревается надеть UIComponent
или же Renderer
реализация, а не в автономном SystemEventListener
реализация. Для последнего вам нужно зарегистрировать его как <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>
Для конкретного функционального требования вы можете использовать вместо этого инициализированный компонент приложения. Это несколько проще и не требует многословного XML:
@ManagedBean(eager=true)
@ApplicationScoped
public void App {
@PostConstruct
public void init() {
// ...
}
@PreDestroy
public void destroy() {
// ...
}
}