2017-10-02 2 views
1

Ich habe über EJB Ausnahmebehandlung zu lesen und das ist mein Verständnis so weit:Handhabung EJBException in Client-Code

sei angenommen Bean B (Server) Transaktion Attribut ist erforderlich:

  • -System Ausnahmen geben sollte als EJBException an den Aufrufer übergeben.
  • Container abfängt EJBException (oder eine andere nicht markiert Ausnahme) wickelt es und wirft es an den Aufrufer
  • wenn der Anrufer innerhalb einer Transaktion ausgeführt wird, die Bean-Instanz verworfen wird, und die Transaktion wird zurückgerollt, erhält der Anrufer die EJBException gewickelten innerhalb einer EJBTransactionRolledBackException.
  • Wenn der Aufrufer nicht in einer Transaktion ist und die Bean-Instanz verworfen wird, erhält der Aufrufer die EJBException in eine RemoteException eingeschlossen.

Wenn ich es mit Anrufer trans. Attribut, das auf REQUIRED festgelegt wird Ich bekomme die EJBException innerhalb einer EJBTransactionRolledBackException verpackt.

Wenn ich es mit Anrufer trans. Attribut auf NIEDRIG gesetzt, erhalte ich die ursprüngliche EJBException im Aufrufer, nicht in eine RemoteException eingewickelt

Warum bekomme ich die RemoteException im zweiten Fall nicht?

Hier ist eine vereinfachte Ansicht meiner Anrufer und Server Bohnen:

@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:

Ich habe gerade gelesen, dass here EJBException an lokale Clients und Remote auf Remote-Clients ausgelöst. Die aufrufende Bean in meinem Beispiel läuft in derselben Serverinstanz wie die Server-Bean, aber sie verbindet sich über die Server-Bean-Remote-Schnittstelle. Ich denke, ich bin nicht klar in der Definition von Remote vs lokalen Client, aber es scheint, dass ich nicht die RemoteException bekomme, weil mein Client nicht remote ist.

Antwort

0

Stellen Sie sicher, dass der Container wirklich die Remote- und nicht die lokale Schnittstelle verwendet.
Vielleicht denken Sie, Sie rufen die Fernbedienung, da ist die Fernbedienung, die Sie beziehen, aber der Container ist in der Tat "Optimierung" für Sie behandeln den Anruf als in war lokal.

Ich erinnere mich, dass ich auf etwas Ähnliches feststeckte, und erst nach einiger Zeit erkannte ich, dass Jboss entfernte Anrufe als lokale Anrufe behandelte, wenn beide EJBs in derselben VM waren. In meinem Fall, als ich die Remote-Schnittstelle verwendete, verwendete der Container nicht den Wert "pass-by-value" (serialisiertes Objekt), sondern übergab die Referenz.

Also mein Rat: Seien Sie sicher, Sie sind in einem "Remote-Szenario". Versuchen Sie, zwei verschiedene Anwendungsserver zwei jbosses i zu verwenden und zu sehen, wenn sich etwas ändert.