Problem with Entity Manager dependency injection in JBoss 5
heinza Mar 25, 2007 11:59 AMHi, everybody!
I'm trying to perform EM dependency injection in servlet using JBoss 5 Beta 1 and get the following deployment exception:
ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] Error installing to Start: name=jboss.web.deployment:war=/simple-web state=Create mode=Manual requiredState=Installed java.lang.RuntimeException: @PersistenceContext(name='env/Test/em',unitName='test-jpa') on EJB: simple-web.war failed to inject on field javax.persistence.EntityManager Test.em Unable to find persistence unit: test-jpa for deployment: simple-web.war at org.jboss.injection.PcEncInjector.inject(PcEncInjector.java:75) at org.jboss.web.tomcat.tc6.TomcatInjectionContainer.populateEnc(TomcatInjectionContainer.java:206) ...
NOTE: When there were some errors in persistence.xml (now fixed), server reported them explicitly. Though, how can it be that server is "Unable to find persistence unit: test-jpa", but is able to find errors in it?
And a warning:
WARN [org.hibernate.ejb.Ejb3Configuration] Persistence provider caller does not implements the EJB3 spec correctly. PersistenceUnitInfo.getNewTempClassLoader() is null.
When invoking servlet I get the following response:
exception javax.servlet.ServletException: Error instantiating servlet class Test org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:86) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212) ... root cause java.lang.RuntimeException: Unable to inject jndi dependency: env/Test/em into field interface javax.persistence.EntityManager org.jboss.injection.JndiFieldInjector.lookup(JndiFieldInjector.java:85) org.jboss.injection.JndiFieldInjector.inject(JndiFieldInjector.java:99) ... root cause javax.naming.NameNotFoundException: Test not bound org.jnp.server.NamingServer.getBinding(NamingServer.java:529) org.jnp.server.NamingServer.getBinding(NamingServer.java:537) org.jnp.server.NamingServer.getObject(NamingServer.java:543) org.jnp.server.NamingServer.lookup(NamingServer.java:267) org.jnp.server.NamingServer.lookup(NamingServer.java:270)
Here is my servlet code:
public class Test ... { @PersistenceContext(unitName="test-jpa") EntityManager em; protected void doGet(...) { Mytable mytable = em.find(Mytable.class, new Integer(5)); response.getOutputStream().print(mytable.getName()); } }
Here is persistence.xml:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" ... > <persistence-unit name="test-jpa" transaction-type="RESOURCE_LOCAL"> <jta-data-source>java:/MySqlDS</jta-data-source> <class>Mytable</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" /> </properties> </persistence-unit> </persistence>
WAR structure:
simple-web.war /META-INF manifest.mf /WEB-INF /classes Test.java (servlet) Mytable.java (entity) web.xml persistence.xml
AFAIK, JBoss 5 is supposed to support dependency injection in servlets. So what's wrong?
Any help would be pleased. Thanks in advance.