2009-06-24 7 views
2

J'ai une application JEE5 qui expose les services en utilisant des beans session (locaux).Comment masquer les détails RuntimeException du client EJB?

Lorsqu'une erreur interne se produit pendant l'exécution du service, une exception RuntimeException est levée et encapsulée par JBoss (5.0.1) dans une exception javax.ejb.EJBTransactionRolledbackException. Le problème est que les applications clientes recevant cette exception EJBTransactionRolledbackException peuvent accéder à des informations détaillées sur l'exception cause runtime, exposant l'architecture interne de mon application. Et je ne veux pas ça. Au lieu de cela, je voudrais que JBoss encapsule toujours RuntimeException levée par les beans de session exposés dans une seule (et simple) TechnicalException (sans cause).

Quelle est la meilleure façon d'y parvenir? (Utilisation d'intercepteurs? Utilisation de la configuration JBoss?)

Répondre

4

Enfin, fonction de la réponse précédente et mes recherches personnelles, j'ai retenu la solution folowing.

J'ai créé un intercepteur dédié à la gestion des défauts de serveur:

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(); 
    } 
}} 

L'exception technique jetée étend EDBException et ne pas exposer la cause RuntimeException:

public class TechnicalException extends EJBException {} 

J'utilise cette Interceptor dans tous les services publics:

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

Ceci est une implémentatio n du Fault Barrier pattern.

Toute exception d'exécution est interceptée, enregistrée et une erreur est signalée au client (sans détails internes) à l'aide d'une exception technique. Les exceptions vérifiées sont ignorées. La gestion RuntimeException est centralisée et séparée de toutes les méthodes métier.

1

Une exception RuntimeException étend java.lang.Exception.

La spécification EJB fournit le traitement pour 2 types d'exceptions (application et système)

Si vous souhaitez lancer une exception du système, vous le feriez habituellement comme si:

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

Pour cacher les détails internes de votre exception du système, il suffit de remplacer:

throw new EJBException(e); 

avec:

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

J'espère que c'est ce que vous cherchiez.

Vive

Questions connexes