package protected interfaces
dunks80 May 1, 2007 6:37 PMSo 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