[jboss-user] [EJB 3.0] - package protected interfaces

dunks80 do-not-reply at jboss.com
Tue May 1 18:37:11 EDT 2007


So playing around today I came across something I found strange and I was hoping someone might be able to explain why the following behavior occurs.

In my example I have 4 classes..



//an ejb3 interface

  | package test;
  | 
  | import javax.ejb.Local;
  | 
  | @Local
  | interface Test
  | {
  |     String test(TestUser testuser);
  | 
  | }
  | 

//an ejb3 implementation class

  | package test;
  | 
  | import javax.ejb.Stateless;
  | import org.jboss.annotation.ejb.LocalBinding;
  | import org.jboss.annotation.ejb.Management;
  | import org.jboss.annotation.ejb.Service;
  | 
  | @Stateless(name = "Test")
  | @LocalBinding(jndiBinding = "Test/local")
  | public class TestImpl implements Test
  | {
  |     public String test(TestUser testUser)
  |     {
  |       
  |         return testUser.sayHello();
  |     }
  | }
  | 

//a simple pojo

  | package test;
  | 
  | import javax.naming.InitialContext;
  | 
  | public class TestUser
  | {
  |     public String test()
  |     {
  |         try
  |         {
  |             InitialContext context=new InitialContext();
  |             Test test=(Test)context.lookup("Test/local");
  |             return test.test(this);
  |         }
  |         catch(Exception e)
  |         {
  |             e.printStackTrace();
  |         }
  |         return null;
  |         
  |     }
  |     
  |     protected String sayHello()
  |     {
  |         return "Hello";
  |     }
  | }
  | 

//and a simple servlet

  | package servlet;
  | 
  | import java.io.IOException;
  | import javax.servlet.ServletException;
  | import javax.servlet.http.HttpServlet;
  | import javax.servlet.http.HttpServletRequest;
  | import javax.servlet.http.HttpServletResponse;
  | import test.TestUser;
  | 
  | public class TestServlet extends HttpServlet
  | {
  | 
  |     @Override
  |     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  |     {
  |         TestUser test=new TestUser();
  |         response.getWriter().write(test.test());
  |         
  |     }
  |     
  | }
  | 
All classes except the servlet are in the same package. 

My first deployment looks like this
                
  | 
  |  
  | ${jboss.home}/server/myserver/deploy/
  |    test-core.jar
  |           test.Test
  |           test.TestUser
  |  
  | ${jboss.home}/server/myserver/deploy/
  |    test-ejb.jar
  |           test.TestImpl
  | 
  | ${jboss.home}/server/myserver/deploy/
  |    test.war
  |            WEB-INF/classes
  |                      servlet.TestServlet
  |                   
If i run this  the deployment fails with this error

  | java.lang.ClassNotFoundException: Unexpected error during load of: test.TestImpl, msg=class test.TestImpl cannot access its superinterface test.Test
  | 

I thought this was strange because they are in the same package just different archives...but then I thought ok maybe this isn't legal.

So then i took all those same components and deployed them in an ear...and everything worked! 

As one last test I removed the ejb3 annotations and just made the ejb classes pojos still deployed serperately as described above (not in a .ear). Also instead of a jndi lookup in the TestUser pojo I did a direct instantiation of the TestImpl class. They worked that way as well. 

So I guess I'm wondering why I can't do a direct deployment of ejb3 implementation classes separately from  their interfaces if the interfaces are package protected?

Thanks 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4042257#4042257

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4042257



More information about the jboss-user mailing list