1 Reply Latest reply on Mar 4, 2008 8:15 AM by jaikiran pai

    Queer error: java.lang.LinkageError: loader constraints viol

    Subhash Bhushan Newbie

      Hi,

      I faced a queer error with JBoss 4.2.2 GA, so thought of reporting it even though I managed to circumvent the problem.

      I have a stateless EJB LoginBean, with remote interface Login:

      Remote Interface:

      package com.justbooks.security;
      
      import javax.ejb.Remote;
      
      import com.justbooks.entities.Profile;
      
      @Remote
      public interface Login {
       public boolean signOn(Profile profile);
       public boolean signOn(String loginName, String loginPassword);
      }
      

      Bean Class:
      package com.justbooks.security;
      
      import javax.ejb.Stateless;
      
      import com.justbooks.entities.Profile;
      import com.justbooks.security.Login;
      import javax.persistence.*;
      import com.justbooks.utility.*;
      
      public @Stateless class LoginBean implements Login
      


      I have a DAO Stateless EJB called ProfileDAOBean, with remote interface ProfileDAO:

      Remote Interface:
      package com.justbooks.dao;
      
      import javax.ejb.Remote;
      
      import com.justbooks.entities.Profile;
      
      @Remote
      public interface ProfileDAO {
       public Profile findProfile(String loginName);
       public boolean authenticate(String loginName, String loginPassword);
       public boolean changePassword(String loginName, String oldPassword,
       String newPassword);
      
      }
      

      Bean Class:
      package com.justbooks.dao;
      
      import javax.naming.Context;
      import javax.naming.NamingException;
      import javax.persistence.EntityManager;
      import javax.persistence.PersistenceContext;
      import javax.persistence.Query;
      import javax.ejb.Stateless;
      
      import com.justbooks.utility.EJBFinder;
      import com.justbooks.entities.Profile;
      import com.justbooks.security.ChangePassword;
      import com.justbooks.security.Login;
      
      public @Stateless class ProfileDAOBean implements ProfileDAO
      


      If I include the lookup code for LoginBean inside ProfileDAOBean, then the application works just fine. But if I use a helper class to find EJBs, my application throws up an error saying
      15:01:57,890 ERROR [[default]] Servlet.service() for servlet default threw exception
      java.lang.LinkageError: loader constraints violated when linking com/justbooks/security/Login class


      EJBHelper:
      package com.justbooks.utility;
      
      import javax.naming.Context;
      import javax.naming.NamingException;
      
      import com.justbooks.security.ChangePassword;
      import com.justbooks.security.Login;
      
      public final class EJBHelper {
       private static Context getInitialContext()
       throws javax.naming.NamingException
       {
       return new javax.naming.InitialContext();
       }
      
       public static Login getLoginEJB() {
       try {
       Context jndiContext = getInitialContext();
       //TODO put these lookup strings in properties file
       Object ref = jndiContext.lookup("JustAutomate/LoginBean/remote");
       Login login = (Login)ref;
       return login;
       }catch (NamingException ne) {
       ne.printStackTrace();
       return null;
       }
       }
      
       public static ChangePassword getChangePasswordEJB() {
       try {
       Context jndiContext = getInitialContext();
       //TODO put these lookup strings in properties file
       Object ref = jndiContext.lookup("JustAutomate/ChangePasswordBean/remote");
       ChangePassword changePassword = (ChangePassword)ref;
       return changePassword;
       }catch (NamingException ne) {
       ne.printStackTrace();
       return null;
       }
       }
      }


      If I change the name of the class to EJBFinder, then everything starts working fine again. Not sure what the problem is.

      As of now, I have circumvented the problem by renaming the class from EJBHelper to EJBFinder.