J'ai lu au sujet de la gestion des exceptions EJB et ceci est ma compréhension à ce jour:manipulation EDBException dans le code client
ASSUMER attribut transaction Bean B (serveur) est nécessaire:
- exceptions du système doivent être jeté comme EJBException à l'appelant.
- intercepte Container EDBException (ou toute autre exception non contrôlée) des enveloppes et jette à l'appelant
- si l'appelant est en cours d'exécution dans une transaction l'instance du bean obtient éliminé et l'opération se fait annulée, l'appelant reçoit le EDBException enveloppé à l'intérieur d'une exception EJBTransactionRolledBackException.
- Si l'appelant n'est pas dans une transaction, l'instance du bean est rejetée, l'appelant obtient l'exception EJBException dans une exception RemoteException.
Lorsque je l'exécute avec l'appelant trans. Attribut défini sur REQUIRED Je récupère l'exception EJBException dans une exception EJBTransactionRolledBackException.
Lorsque je l'exécute avec l'appelant trans. l'attribut mis à JAMAIS, j'attrape l'exception EJBException d'origine dans l'appelant, pas encapsulé dans une exception RemoteException
Pourquoi ne reçois-je pas l'exception RemoteException dans le second cas?
est ici une vue simplifiée de mes grains de l'appelant et serveur:
@Stateless
public class BeanA implements BeanAInterface{
@Override
public void callBeanB() {
BeanBInterface beanBInterface;
try{
beanBInterface = (BeanBInterface) new InitialContext().lookup(BeanBInterface.class.getName());
beanBInterface.getResponse();
} catch (Exception e){
log.error("Caught Exception: " + e);
}
}
}
@Stateless
public class BeanB implements BeanBInterface{
@Override
public void getResponse(){
throw EJBException("Catch me.");
}
}
EDIT:
Je viens de lire here que EDBException est jeté aux clients locaux et RemoteException aux clients distants. Dans mon exemple, le bean appelant fonctionne dans la même instance de serveur que le bean serveur, mais il se connecte via l'interface distante du bean serveur. Je suppose que je ne suis pas clair sur la définition de client distants vs local, mais il semble que je ne reçois pas l'exception RemoteException parce que mon client n'est pas distant.