# EJBException von EManager.persist abfangen u. verarbeiten



## norbertbaum (13. Okt 2008)

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



```
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 (14. Okt 2008)

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 (14. Okt 2008)

Hallo,
danke für deine Antwort!

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


```
@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 (14. Okt 2008)

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 (14. Okt 2008)

genau das war meine idee!
aber mit einer normalen try-catch-block
und dann im 

```
try
{
 em.persist(object);
}
catch(EJBException e)
{
throw new eigeneExceptionen();
}
```

klappt nicht!!
oder wie hattest du es gedacht?

DANKE


----------



## norbertbaum (17. Okt 2008)

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 (17. Okt 2008)

norbertbaum hat gesagt.:
			
		

> genau das war meine idee!
> aber mit einer normalen try-catch-block
> und dann im
> 
> ...



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 (17. Okt 2008)

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 (17. Okt 2008)

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


----------



## norbertbaum (17. Okt 2008)

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 (17. Okt 2008)

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!!!!!!!!!!!!!


----------



## Guest (17. Okt 2008)

So ungefähr
	
	
	
	





```
@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 (18. Okt 2008)

Hallo Gast,
das sieht irgendwie GUT aus
werde es morgen mal testen und dann auch vollständig zu verstehen

VIELEN DANK


----------



## norbertbaum (20. Okt 2008)

also irgendwie bekomme ich es nicht auf die reihe 



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


----------

