EJBException von EManager.persist abfangen u. verarbeiten

Status
Nicht offen für weitere Antworten.

norbertbaum

Mitglied
Guten Abend,

ich bekomme immer die folgenden Exceptions.
Ursache:
Ich möchte den selben Usernamen noch einmal eintragen - also doppelter eintrag in der Unique-Spalte
Das Ein Fehler kommt ist ja ok!

ABER
ich möchte die Exception selber fangen und dann weiter verarbeiten mit Benutzerwarnungen etc...

Ich hoffe ich konnte euch genug Infos geben.

JavaEE und TopLink und EJB3 nutze ich


DANKE EUCH


Code:
Exception occurred during event dispatching:
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaktion für Zurücksetzung markiert.; nested exception is: 
        javax.transaction.RollbackException: Transaktion für Zurücksetzung markiert.
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaktion für Zurücksetzung markiert.; nested exception is: 
        javax.transaction.RollbackException: Transaktion für Zurücksetzung markiert.

....

javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.RemoteException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaktion für Zurücksetzung markiert.; nested exception is: 
        javax.transaction.RollbackException: Transaktion für Zurücksetzung markiert.
 

FArt

Top Contributor
Vermutung: die eigentliche Exception landet irgendwie im Container, der daraufhin eine EJBException erzeugt.

Deklariere eine entsprechende Exception an der Businessmethode "User anlegen" und schon kann man diese auf dem Client verarbeiten.
 

norbertbaum

Mitglied
Hallo,
danke für deine Antwort!

Aber könntest du mir dabei helfen? die Exceptionbehandlung zuschreiben.

Code:
@Stateless(mappedName="Ing.NutzerBean")
public class NutzerBean implements NutzerBeanRemote
{

    @PersistenceContext
    private EntityManager em;   

    public void create(Nutzer nutzer) 
    {
            em.persist(nutzer); 
    }
}


Vielen Dank schon einmal!
 

FArt

Top Contributor
Lass "createUser" eine konkrekte Exception werfen (z.B. UserCreationException) wenn ein Fehler auftritt.

Der ursprüngliche Fehler könnte z.B. aus der Persistenz kommen => diesen Fehler abfangen, den eigenen Fehler werfen und im Client behandeln.
 

norbertbaum

Mitglied
genau das war meine idee!
aber mit einer normalen try-catch-block
und dann im
Code:
try
{
 em.persist(object);
}
catch(EJBException e)
{
throw new eigeneExceptionen();
}

klappt nicht!!
oder wie hattest du es gedacht?

DANKE
 

norbertbaum

Mitglied
ich kann mir nicht vorstellen, das ich der einzige mit dem Problem bin!

wie fangt ihr denn euere Fehler ab?
wenn ein Datensatz schon in der DB ist?
also wenn in die Unique-Spalte ein Eintrag doppelt geschrieben wird?

Danke euch!!
 

GilbertGrape

Bekanntes Mitglied
norbertbaum hat gesagt.:
genau das war meine idee!
aber mit einer normalen try-catch-block
und dann im
Code:
try
{
 em.persist(object);
}
catch(EJBException e)
{
throw new eigeneExceptionen();
}

klappt nicht!!
oder wie hattest du es gedacht?

DANKE

na wird die Exception denn da geworfen?
Ich arbeite nicht mit den 3 Technologien, sondern mit Hibernate. Da ist es so, dass diese Exception noch nicht beim persist auftritt, sondern erst bei commit. Machst du denn sowas auch?
 

norbertbaum

Mitglied
siehe oben!
also wenn ich einen neuen Nutzer einfügen will
rufe ich die create-methode auf!

sollte jetzt der Nutzer schon vorhanden sein = kommt die EJBException :(

also commit mache ich garnet
 

FArt

Top Contributor
Die Businessmethode am Bean soll eine deklarierte Exception werfen. Die kommt dann genau so beim Client an.
 

norbertbaum

Mitglied
entweder ich arbeite wieder mal mit irgendwas, was keiner nutzt oder ich kanns net erklären :(

ich nutze TopLINK als PersistenzManager...

em.persist() gibt mir die EJBException mit StackTrace auzf der console aus!
 

FArt

Top Contributor
em.persist() wird keine EJBException werfen, somit kannst du sie nicht fangen.

Der Container wirft die EJBException: http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/ejb/EJBException.html

Also: fange die Exception, die aus em.persist() kommen könnte, deklariere eine eigene Exception an der Methode create deines stateless session beans und wirf bei einem Fehler aus em.persist() die deklarierte Exception weiter. Diese Exception kann (weil sie an der Methode deklariert ist) vom Client gefangen und verarbeitet werden.

Wenn dir das immer noch nicht geholfen hat: ein J2EE Tutorial wäre das richtige für dich!!!!!!!!!!!!!
 
G

Guest

Gast
So ungefähr
Code:
@ApplicationException(rollback = true)
public final class ServiceException extends Exception {
   private static final long serialVersionUID = -7100429681947931422L;

   private String errorcode;

   public ServiceException(final String errorcode, final String message) {
      super(message);
      this.errorcode = errorcode;
   }

   public String getErrorcode() {
      return errorcode;
   }
}

...

public Person savePerson(final Person person) throws ServiceException {
   try {
      em.persist(person);
      return person;
   }
   catch(PersistenceException e) {
      throw mapException(e); 
   }
}
   
private ServiceException mapException(final Throwable throwable) {
   // Serverseitig sollte der Fehler mindestens geloggt werden
   getLogger().error(throwable);
   // Die übergebene Exception auswerten, mit Fehlercode und Klartext 
   // für den Benutzer versehen. Die PersistenceException o.ä. würde ich 
   // nicht bis zum Client schleppen, sprich als Inner-Exception übertragen.
   // Den Benutzer interessiert es nicht die Bohne.
   ServiceException error = ...; 
   return error;
}
 

norbertbaum

Mitglied
also irgendwie bekomme ich es nicht auf die reihe :(


Code:
@Stateless(mappedName="Ing.NutzerBean")
public class NutzerBean implements NutzerBeanRemote
{

    @PersistenceContext
    private EntityManager em;   

    public Nutzer create(Nutzer nutzer) 
    {
        em.persist(nutzer);
        return nutzer;
    }
}

em.persist(nutzer)
wirf die EJBException!

ich wundere mich auch warum ich es nicht hinbekomme!
Ich musste letztes Exceptions aus dem POI Jarakta fangen und eigene Werfen...das ging ohne Probleme
mit try-catch fangen und im catch block dann mit throws new eigeneException()

warum klappt das net mit der EJBException...
ich will eigentlich ja auch keine Anwendung habe, die ständig Exceptions in die Console hackt, weil ich sie selbst nicht fangen und verarbeiten kann

:(


Wie immer - ICH DANKE euch, das ihr euch die Zeit für die Probleme anderer nehmt
DANKE

Edit:Lösung:
in der create-Methode mache ich eine SQL/EJBQL-Abfrage ob der Nutzerschon vorhanden ist und wenn nicht wird er erst hinzugefügt

Trotzdem danke für euere Mühe
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben