# Problem mit EJB: Bean soll Objekt eigener Klasse zurückgeben



## Der Dieter (5. Sep 2008)

Hallo,
ich bin ganz neu in der Java EE Welt, deswegen diese Frage, die für euch vermutlich leicht erscheint.

Also ich habe in einem Bean (EJB 3, GlassFish) eine Methode schreiben, welches mir ein Objekt von einer eigenen Klasse, die innerhalbs des Beans ist, zurückgibt.

Also der Aufbau ist wie folgt:

*ejb:*
Session.java

```
package shop;
import javax.ejb.Remote;


@Remote
public interface Session {
    public User getUser();
}
```

SessionBean.java

```
package shop;
import javax.ejb.Stateless;
import javax.ejb.Remove;


@Stateless
public class SessionBean implements Session {
    public User getUser() {
        return new User();       
    }

}
```

User.java

```
package shop;

public class User  {
    public String getUsername() {
        return "Max Mustermann";
    }
}
```


Dann mein *Client*:

```
package shopClient;
import shop.Session;
import shop.User;
import javax.ejb.EJB;


public class ShopClient {
    @EJB
    private static Session ses;

    public static void main(String[] args) {
        try {
            User us = ses.getUser();
            System.out.println(us.getUsername());
        } catch(Exception ex) {
            System.out.println("Error: "+ ex.getMessage());
        }        
    }
}
```


Wenn ich es ausführe, erhalte ich immer folgende Fehlermeldung:
nested exception is: java.rmi.MarshalException: CORBA MARSHAL 1398079695 No; nested exception is: 
        org.omg.CORBA.MARSHAL:   vmcid: SUN  minor code: 207  completed: No


Könnte mir jemand helfen, wodran es liegt? Irgendwie find ich nix zum Thema, wobei mir vermutlich auch die richtigen Suchwörter fehlen.


Wenn ich die SessionBean wie folgt abändere (ebenso das Interface und den Client anpasse):

```
package shop;
import javax.ejb.Stateless;
import javax.ejb.Remove;


@Stateless
public class SessionBean implements Session {
    public String getUser() {
        return new User().getUsername();       
    }

}
```

Dann klappt es einwandfrei. Der Client gibt mir 'Max Musterman' aus.


Ebenso wenn ich bei public String getUser() z.B. eine Exception vom Typ User werfe (User dann von Exception abgeleitet), dann kann ich im catch Block des Clients auf ((User)ex).getUsername() zugreifen.


Wäre echt super, wenn mir jemand den Wink mit dem Zaunpfahl geben könnte.


----------



## ps (5. Sep 2008)

Alle Klassen welche du übers Netzwerk schicken willst müssen das Markerinterface java.io.Serializable implementieren. Exception implementiert dieses - daher funktioniert es in diesem Fall. Ein einfacher String macht auch keine Probleme.


```
package shop; 

public class User implements java.io.Serializable { 
    public String getUsername() { 
        return "Max Mustermann"; 
    } 
}
```


----------



## Der Dieter (5. Sep 2008)

Hallo,
okay danke, es klappt 

Naja ganz schön verwirrend das ganze Thema am Anfang.


----------

