Whats wrong with this stateful session beans?
heinrich Oct 17, 2005 11:13 AMHi,
this thing here gets me upset.
I have a simple stateful session bean which is looked up by a remote client.
During the lookup i got an exception:
First the Bean:
package musicstore.session;
import java.util.ArrayList;
import java.util.Collection;
import javax.annotation.Resource;
import javax.ejb.PostConstruct;
import javax.ejb.Remote;
import javax.ejb.SessionContext;
import javax.ejb.Stateful;
import musicstore.entity.MusicCD;
@Remote(Order.class)
public @Stateful class OrderBean implements Order{
/**
*
*/
private static final long serialVersionUID = 1L;
@Resource SessionContext sessionContext;
public Collection <MusicCD> orderList;
private String customerName = "uups, i forgot to set a name";
// @Resource
// protected InitialContext iniCtx;
@PostConstruct
public void initialize() {
this.orderList = new ArrayList<MusicCD>();
}
/**
* Adds a cd to the orderlist
* @param cd
*/
public void addCd(MusicCD cd) {
this.orderList.add(cd);
}
/**
* Removes a cd from the orderlist
* @param cd
*/
public void removeCD(MusicCD cd) {
this.orderList.remove(cd);
}
/**
* Returns a complete arary of all cds in the orderlist
*
* @return
*/
public Collection<MusicCD> getAll() {
return this.orderList;
}
/**
* Sets the name of the customer for the order
* @param name
*/
public void setCustomerName(String name) {
this.customerName = name;
}
/**
* "Submits" the order and returns a string containing the order
* @return
*/
public String submit() {
// submit the data to a message queue
// TODO
String orderstr = new String();
orderstr = "New Order: \n Customer: "+this.customerName+"\n";
// Append all cd in the queue
int count = 1;
for (MusicCD cd : this.orderList) {
orderstr = orderstr + count +". " + cd + "\n";
count++;
}
return orderstr;
}
}
The remote interface
package musicstore.session;
import java.util.Collection;
import musicstore.entity.MusicCD;
public interface Order {
/**
* Adds a cd to the orderlist
* @param cd
*/
public void addCd(MusicCD cd);
/**
* Removes a cd from the orderlist
* @param cd
*/
public void removeCD(MusicCD cd);
/**
* Returns a complete arary of all cds in the orderlist
*
* @return
*/
public Collection<MusicCD> getAll();
/**
* Sets the name of the customer for the order
* @param name
*/
public void setCustomerName(String name);
/**
* Submits the order and returns a string containing the order
*/
public String submit();
}
I think this must be without any mistakes. Correct me if its not :-/
And now the client:
package musicstore.clients;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.annotation.EJB;
import javax.naming.InitialContext;
import musicstore.entity.MusicCD;
import musicstore.session.Inventory;
import musicstore.session.Order;
import musicstore.session.OrderBean;
public class MusicStoreClient {
private Order order;
public void doinit() {
try {
System.out.println("Name: " + Order.class.getName());
order = (Order) ctx.lookup(Order.class.getName());
System.out.println(order.submit());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main (String[] args) {
MusicStoreClient msc = new MusicStoreClient();
msc.doinit();
}
}Everytime i call teh client i got an exception like this one:
Exception in thread "main" java.lang.NoClassDefFoundError: Lorg/jboss/invocation/Invoker; at java.lang.Class.getDeclaredFields0(Native Method) at java.lang.Class.privateGetDeclaredFields(Class.java:2232) at java.lang.Class.getDeclaredField(Class.java:1852) at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1555) at java.io.ObjectStreamClass.access$600(ObjectStreamClass.java:47) at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:381) at java.security.AccessController.doPrivileged(Native Method) at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:373) at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:268) at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:504) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1546) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339) at org.jboss.aop.joinpoint.InvocationResponse.readExternal(InvocationResponse.java:107) at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1753) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1711) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339) at org.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:73) at org.jboss.remoting.transport.socket.SocketClientInvoker.transport(SocketClientInvoker.java:242) at org.jboss.remoting.RemoteClientInvoker.invoke(RemoteClientInvoker.java:112) at org.jboss.remoting.Client.invoke(Client.java:226) at org.jboss.remoting.Client.invoke(Client.java:189) at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:41) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88) at org.jboss.aspects.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:34) at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:88) at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:46) at $Proxy0.createProxy(Unknown Source) at org.jboss.ejb3.JndiProxyFactory.getObjectInstance(JndiProxyFactory.java:32) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304) at org.jnp.interfaces.NamingContext.getObjectInstance(NamingContext.java:1110) at org.jnp.interfaces.NamingContext.getObjectInstanceWrapFailure(NamingContext.java:1127) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:690) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572) at javax.naming.InitialContext.lookup(InitialContext.java:351) at musicstore.clients.MusicStoreClient.doinit(MusicStoreClient.java:32) at musicstore.clients.MusicStoreClient.main(MusicStoreClient.java:223)
When i turn the Bean to a stateless SessionBean, no Problem.
Is there a special way to look up stateful SessionBeans which i do not know?
Please help, this is annoying very much.
Thanks
martin