2009-06-24 14 views
2

Ich habe eine JEE5-Anwendung, die Dienste mit (lokalen) Session-Beans verfügbar macht.Wie können RuntimeException-Details vom EJB-Client ausgeblendet werden?

Wenn während der Ausführung des Diensts ein interner Fehler auftritt, wird eine RuntimeException von JBoss (5.0.1) in einer javax.ejb.EJBTransactionRolledbackException ausgelöst und gekapselt.

Das Problem besteht darin, dass Clientanwendungen, die diese EJBTransactionRolledbackException empfangen, auf detaillierte Informationen zur Cause-Laufzeitausnahme zugreifen können, wodurch die interne Architektur meiner Anwendung offengelegt wird. Und das will ich nicht.

Stattdessen möchte ich, dass JBoss RuntimeException, die von exposed Session-Beans ausgelöst wird, immer in eine einzige (und einfache) TechnicalException (ohne Ursache) kapselt.

Was ist der beste Weg, dies zu erreichen? (Verwenden von Interceptors? Verwenden der JBoss-Konfiguration?)

Antwort

4

Schließlich basierend auf vorherigen Antwort und meine persönlichen Forschungen, behielt ich die Folowing Lösung.

Ich habe einen Abfangjäger erstellt dedizierten Server Fehler verwalten:

public class FaultBarrierInterceptor { 

@AroundInvoke 
public Object intercept(final InvocationContext invocationContext) throws Exception { 
    try { 
     return invocationContext.proceed(); 
    } catch (final RuntimeException e) { 
     final Logger logger = Logger.getLogger(invocationContext.getMethod().getDeclaringClass()); 
     logger.error("A fault occured during service invocation:" + 
       "\n-METHOD: " + invocationContext.getMethod() + 
       "\n-PARAMS: " + Arrays.toString(invocationContext.getParameters()), e); 
     throw new TechnicalException(); 
    } 
}} 

Die geworfene technische Ausnahme erstreckt EJBException und deckt nicht die Ursache Runtime:

public class TechnicalException extends EJBException {} 

Ich benutze diese Abfangjäger in allen öffentliche Dienste:

@Stateless 
@Interceptors({FaultBarrierInterceptor.class}) 
public class ShoppingCardServicesBean implements ShoppingCardServices { ... 

Dies ist eine Implementierung n der Fault Barrier pattern.

Jede Laufzeitausnahme wird abgefangen, protokolliert und ein Fehler wird dem Client (ohne interne Details) mithilfe einer TechnicalException signalisiert. Überprüfte Ausnahmen werden ignoriert.

Die RuntimeException-Behandlung ist zentralisiert und von allen Geschäftsmethoden getrennt.

1

Alle RuntimeException erweitert java.lang.Exception.

Die EJB-Spezifikation sieht 2 Arten von Ausnahmen (Application und System) Handhabung

Wenn Sie ein System Exception werfen möchten, würden Sie tun es in der Regel wie folgt:

try { 
.... your code ... 
}catch(YourApplicationException ae) { 
    throw ae; 
}catch(Exception e) { 
    throw new EJBException(e); //here's where you need to change. 
} 

zu verstecken die internen Details des Systems Ausnahme, einfach ersetzen:

throw new EJBException(e); 

mit:

throw new EJBException(new TechnicalException("Technical Fault")); 

Hoffe, das ist, was Sie gesucht haben.

Prost

Verwandte Themen