2 Replies Latest reply on Feb 14, 2008 4:19 PM by alexg79

    EJB3 and JBoss client java.io.InvalidClassException

    spawnoflinktis

      Hello, I am relativly new to Enterprise development and especially EJB3, I have looked everywhere over the internet for a solution to this but to no avail. I'm using JBoss 4.2.2GA. Anyway, I deploy my entity and session beans properly and I verify that my session bean has started in Jboss's console.
      ************
      So my session bean is :

      package com;
      import javax.ejb.Stateless;
      import javax.persistence.EntityManager;
      import javax.persistence.PersistenceContext;
      import java.io.Serializable;
      import com.EntityDB;
      @Stateless
      public class MainSessionBean implements Serializable, SessionBeanRemote{
      @PersistenceContext
      private EntityManager em;
      static final long serialVersionUID = -5951007355563165335L;
      
      public void setToDB(String in1, String in2)
      {
      EntityDB edb = new EntityDB();
      edb.setName(in1);
      edb.setPassword(in2);
      em.persist(edb);
      }
      }

      **********************
      And its interface is
      package com;
      import javax.ejb.Remote;
      import java.io.Serializable;
      @Remote
      public interface SessionBeanRemote extends Serializable{
      static final long serialVersionUID = -1145492871624366669L;
      
      public void setToDB(String in1, String in2);
      
      }

      *******************
      my client code is
      package test;
      import java.util.Properties;
      import javax.naming.Context;
      import javax.naming.InitialContext;
      import javax.naming.NamingException;
      import com.SessionBeanRemote;
      import java.io.Serializable;
      public class MainTestClient implements Serializable{
      
      static final long serialVersionUID = -3849529018242856585L;
      
      public static void main(String[] args) {
      
      Properties properties = new Properties();
      properties.put("java.naming.factory.initial",
      "org.jnp.interfaces.NamingContextFactory");
      properties.put("java.naming.factory.url.pkgs",
      "=org.jboss.naming:org.jnp.interfaces.jnp");
      properties.put("java.naming.provider.url", "localhost:1099");
      Context context=null;
      try {
      context = new InitialContext(properties);
      Object o= context.lookup("MainSessionBean/remote");
      Object j = null;
      SessionBeanRemote beanRemote = (SessionBeanRemote)j;
      beanRemote.setToDB("myUser","myPswrd");
      
      } catch (NamingException e) {
      e.printStackTrace();
      throw new RuntimeException(e);
      }
      System.out.println("finished");
      }
      }

      *****************************
      whenever i run the client i get the exception
      javax.naming.CommunicationException [Root exception is java.io.InvalidClassException: org.jboss.ejb3.remoting.BaseRemoteProxy; local class incompatible: stream classdesc serialVersionUID = -2711693270411201590, local class serialVersionUID = 1126421850898582900]
      at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:722)
      at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
      at javax.naming.InitialContext.lookup(Unknown Source)
      at test.MainTestClient.main(MainTestClient.java:30)
      Caused by: java.io.InvalidClassException: org.jboss.ejb3.remoting.BaseRemoteProxy; local class incompatible: stream classdesc serialVersionUID = -2711693270411201590, local class serialVersionUID = 1126421850898582900
      at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
      at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
      at java.io.ObjectInputStream.readClassDesc(Unknown Source)
      at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
      at java.io.ObjectInputStream.readClassDesc(Unknown Source)
      at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
      at java.io.ObjectInputStream.readClassDesc(Unknown Source)
      at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
      at java.io.ObjectInputStream.readObject0(Unknown Source)
      at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
      at java.io.ObjectInputStream.readSerialData(Unknown Source)
      at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
      at java.io.ObjectInputStream.readObject0(Unknown Source)
      at java.io.ObjectInputStream.readObject(Unknown Source)
      at java.rmi.MarshalledObject.get(Unknown Source)
      at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:72)
      at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:652)
      ... 3 more
      


      I apologize for the large nature of this post, but ive been dealing with this problem for several days now. The interesting things i have found is that even if i do not place the serialVersionUID's into all the classes i recieve the same exception. If i try to run this code on another machine running Jboss 4.2.2GA as well i get the same values, and if i try and make another project with similar code i get the same Error with the same serialVersionUID's, Im sure that is important but i cannot figure out what could be going wrong.
      Thanks in advance for any responses

        • 1. Re: EJB3 and JBoss client java.io.InvalidClassException
          spawnoflinktis

          Update: a new serialVersionUid has appeared when i started cutting out .jars however this could have been caused by other things as well, i thought maybe eclipse was causing the problem so i started another project with just my client in it, and set up a jar file (the exact same one that deploys on the server) as a user library and import the com.sessionDB from there. still no luck and i have the second serialVersionUID still appearing. any suggestions would really help because I have run out of ideas to test for.
          Thanks

          • 2. Re: EJB3 and JBoss client java.io.InvalidClassException
            alexg79

            Why are you using SerialVersionUIDs in the first place? I've done just fine without. Oh, and remote interfaces don't need to implement Serializable anyway.