Как указано BalusC, actionListener
по умолчанию использует исключение, но в JSF 2.0 есть немного больше. А именно, он не просто проглатывает и записывает журналы, а фактически публикует исключение.
Это происходит с помощью такого вызова:
context.getApplication().publishEvent(context, ExceptionQueuedEvent.class,
new ExceptionQueuedEventContext(context, exception, source, phaseId)
);
Слушателем по умолчанию для этого события является ExceptionHandler
, который для Моджары установлен на com.sun.faces.context.ExceptionHandlerImpl
. Эта реализация в основном отменяет любое исключение, за исключением случаев, когда это относится к исключению AbortProcessingException, которое регистрируется. ActionListeners обертывают исключение, которое генерируется клиентским кодом в таком AbortProcessingException, которое объясняет, почему они всегда регистрируются.
Этот ExceptionHandler
может быть заменен, однако, в faces-config.xml с пользовательской реализацией:
<exception-handlerfactory>
com.foo.myExceptionHandler
</exception-handlerfactory>
Вместо того, чтобы слушать глобально, один компонент может также слушать эти события. Ниже приведено доказательство этой концепции:
@ManagedBean
@RequestScoped
public class MyBean {
public void actionMethod(ActionEvent event) {
FacesContext.getCurrentInstance().getApplication().subscribeToEvent(ExceptionQueuedEvent.class, new SystemEventListener() {
@Override
public void processEvent(SystemEvent event) throws AbortProcessingException {
ExceptionQueuedEventContext content = (ExceptionQueuedEventContext)event.getSource();
throw new RuntimeException(content.getException());
}
@Override
public boolean isListenerForSource(Object source) {
return true;
}
});
throw new RuntimeException("test");
}
}
(обратите внимание: это не то, как обычно нужно кодировать слушателей, это только для демонстрационных целей!) [/ G0]
Вызов этого из Facelet следующим образом:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<h:form>
<h:commandButton value="test" actionListener="#{myBean.actionMethod}"/>
</h:form>
</h:body>
</html>
Будет отображаться страница с ошибкой.