# TransferObjects's in EJB 3 klappt nicht



## CelikBlek (19. Nov 2010)

Hallo zusammen,

ich hoffe ihr könnt mir helfen. Ich versuche seit zwei Tagen das Problem zu lösen, aber es will einfach nicht gelöst werden. Zunächst mal die Problemstellung:

Umgebung:
JEE fähiger Client, EJB3, Glassfish, Eclipse

Aufgabe:
Ich möchte aus dem Client eine Methode im EJB Projekt aufrufen.

Problem:
Der Aufruf funktioniert. Wenn ich nur Strings, int's usw. übergebe oder erwarte, dann gehts. Es funktioniert nur mit einem eigenen Objekt (TransferObject) nicht. Bekomme den Fehler:

```
javax.ejb.EJBException: java.rmi.MarshalException: CORBA MARSHAL 1398079745 Maybe; nested exception is: org.omg.CORBA.MARSHAL: vmcid: SUN minor code: 257 completed: Maybe
```

Sourcen:
MeinClient.java

```
VOUserIF vo = null;
try {
   Properties jndiProps = new Properties();
   jndiProps.put("java.naming.factory.initial", "com.sun.enterprise.naming.impl.SerialInitContextFactory");
   jndiProps.put("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
   jndiProps.put("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
   jndiProps.setProperty("org.omg.CORBA.ORBInitialHost", "127.0.0.1");
   jndiProps.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
   
   InitialContext ctx = new InitialContext(jndiProps);
   UserBeanRemote bean = (UserBeanRemote) ctx.lookup("jndi/userbean");
   vo = bean.createUser();
   ...
```
UserBean.java

```
@Stateless(mappedName = "jndi/userbean")
public class UserBean implements UserBeanRemote {
...
   @Override
   public VOUserIF createUser() {
      VOUserIf vo = new VOUser();
      vo.setName("Test");
      return vo;
   }
}
```
UserBeanRemote.java

```
@Remote
public interface UserBeanRemote {
   public VOUserIF createUser();
   public String sayHello(String name);
}
```
VOUserIF.java

```
public interface VOUserIF extends Serializable {
	/**
	 * Setter-Method for the attribute.
	 * @param username the username to set
	 */
	public void setUsername(String username);

	/**
	 * Getter-Method for the attribute
	 * @return the username
	 */
	public String getUsername();
}
```
VOUser.java

```
public interface VOUser implements VOUserIF, Serializable {
        String name;	
 
        public VOUser() {
        }

        /**
	 * Setter-Method for the attribute.
	 * @param username the username to set
	 */
	public void setName(String name) {
           this.name=name;
        }

	/**
	 * Getter-Method for the attribute
	 * @return the name
	 */
	public String getName() {
           return name;
        }
}
```

Was mach eich hier falsch? Ich habe das Objekt Serializable gemacht. Das Objekt hat eine Schnittstelle für den Transfer. Was fehlt mir?

Vielen Dank im Voraus.


----------



## bronks (19. Nov 2010)

VOUser sollte m.E. eine Class und kein Interface sein. Es könnte sein, daß Eclipse den VOUser wegen dem Fehler einfach nicht kompiliert hat und im Build eine alte Class liegt.


----------



## CelikBlek (20. Nov 2010)

VOUser ist ja auch ein Class, die VOUserIF implementiert. Der Fehler kommt auch nicht beim Compile sondern erst zur Laufzeit.

Wie läuft denn das? Muss der "vo" beim Rückgabe vom Aufruf "vo = bean.createUser();" ein Interface sein oder eine Klasse? Also die Rückgabe in der Klasse "UserBean" die Methode "createUser()".


----------

