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);
}
}使用的想法吗?
发布于 2012-05-01 02:53:02
正如它的javadoc告诉您的那样,@ListenerFor的目的是放在UIComponent或Renderer实现上,而不是放在独立的SystemEventListener实现上。对于后者,您需要在faces-config.xml中将其注册为<system-event-listener>。
例如。
<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() {
// ...
}
}https://stackoverflow.com/questions/10376053
复制相似问题