2010-11-15 6 views
6

używam szew 2.2, primefaces jako warstwa prezentacji widoku. Napisałbym jakąś infrastrukturę, aby uchwycić wszystkie wyjątki. Na przykład umieścić w ciągu Facelets następujący fragment kodu:Szew scentralizowane wyjątki

<p:commandButton actionListener="#{mySeamController.aMethod()}" 

w MySeamController klasie powyższej metody:

public void aMethod() 
{ 
    throw new NullPointerException(); 
} 

w kontrolerze i napisać metodę:

@Observer("myapp.exceptions.exception") 
public void onSystemException(Exception e) 
{ 
    System.out.println("a exception was occurred"); 

} 

Piszę klasę, aby wychwytywać wyjątki:

@Scope(ScopeType.APPLICATION) 
@BypassInterceptors 
@Install(precedence = Install.MOCK, classDependencies = "javax.faces.context.FacesContext") 
@Name("org.jboss.seam.exception.exceptions") 
public class ExceptionHandler extends org.jboss.seam.exception.Exceptions{ 


private static final long serialVersionUID = 1L; 
@Logger 
    Log log; 

public void handle(Exception e) throws Exception 
{    
    Events.instance().raiseEvent("myapp.exceptions.exception", e); 
    super.handle(e); 

} 
} 

ale zauważyłem Taht podczas korzystania ActionListener

<p:commandButton actionListener="#{mySeamController.aMethod()}" 

zamiast akcję

<p:commandButton action="#{mySeamController.aMethod()}" 

bez wyjątku obserwowano przez klasy ExceptionHandler. Dlaczego? Czy ktoś może pomóc? Pozdrowienia

+0

Czy kiedykolwiek rozwiązałeś to? To nie jest rozwiązanie, ale aby zaoszczędzić sobie trochę kłopotów, spójrz na kod źródłowy klasy Wyjątki. Podnosi zdarzenia dla rzutów wyjątków, więc nie trzeba tworzyć pośrednika obsługi: Events.instance(). RaiseEvent ("org.jboss.seam.exceptionNotHandled", e); Events.instance(). RaiseEvent ("org.jboss.seam.exceptionHandled", przyczyna); Używam tego do śledzenia wyjątków sesji użytkownika (co najmniej wyjątków Seam). – gebuh

Odpowiedz

0

Utwórz przechwytujący, a będziesz mógł złapać wszystko, czego potrzebujesz.