Die Injektion EntityManager Ergebnisse in NullPointerException in TomEE?
Hier ist meine MovieBean.java:
@Stateless
public class MovieBean {
@PersistenceContext
private EntityManager em;
/**
* Default constructor.
*/
public MovieBean() {
//TODO Auto-generated constructor stub
}
public List<Movie> getAllMovies() {
Query query = em.createQuery("SELECT m FROM Movie m");
return query.getResultList();
}
Meine MoviesServlet
verwendet diese MovieBean wie diese:
@WebServlet("/MoviesServlet")
public class MoviesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
private MovieBean mb;
private List<Movie> getMovies() {
return mb.getAllMovies();
}
Und in meinem doGet
Methode, die ich verwenden die getMovies
Methode, um eine Liste aller Filme. Allerdings bekomme ich den folgenden Ausnahmen:
javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is:
java.lang.NullPointerException
org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:363)
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:283)
bg.cinemate.beans.MovieBean$LocalBeanProxy.getAllMovies(bg/cinemate/beans/MovieBean.java)
bg.cinemate.servlets.MoviesServlet.getMovies(MoviesServlet.java:27)
bg.cinemate.servlets.MoviesServlet.doGet(MoviesServlet.java:42)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
java.lang.NullPointerException
bg.cinemate.beans.MovieBean.getAllMovies(MovieBean.java:31)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:181)
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:163)
org.apache.openejb.cdi.CdiInterceptor.invoke(CdiInterceptor.java:126)
org.apache.openejb.cdi.CdiInterceptor.access$000(CdiInterceptor.java:42)
org.apache.openejb.cdi.CdiInterceptor$1.call(CdiInterceptor.java:63)
org.apache.openejb.cdi.CdiInterceptor.aroundInvoke(CdiInterceptor.java:69)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:181)
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:163)
org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:176)
org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:95)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:181)
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:163)
org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:138)
org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:239)
org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:191)
org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:246)
org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:241)
org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:83)
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:279)
bg.cinemate.beans.MovieBean$LocalBeanProxy.getAllMovies(bg/cinemate/beans/MovieBean.java)
bg.cinemate.servlets.MoviesServlet.getMovies(MoviesServlet.java:27)
bg.cinemate.servlets.MoviesServlet.doGet(MoviesServlet.java:42)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
Meine persistance.xml
- Datei ist so konfiguriert:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="cinema" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/cinema" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="password" />
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
</properties>
</persistence-unit>
</persistence>
Habe ich versucht, es zu ändern (probiert mit dargestellt hier), aber es macht auch nicht den server starten (sagt das Zeitlimit überschritten hat, selbst nachdem ich versucht es zu ändern, um 200 Sekunden).
Ich benutze Java7, OpenEJB und TomEE.
EDIT 1:
Ich änderte meine persistence.xml
dieser:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit transaction-type="RESOURCE_LOCAL" name="cinema">
<jta-data-source>java:openejb/Connector/Default JDBC Database</jta-data-source>
<non-jta-data-source>java:openejb/Connector/Default Unmanaged JDBC Database</non-jta-data-source>
<class>bg.cinemate.beans.MovieBean</class>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
</properties>
</persistence-unit>
</persistence>
Versucht @PersistenceContext(unitName="cinema")
und den server gestartet, aber es gibt mir die gleichen Ausnahmen.
- Ich würde den header persistence.xml auf die version 2.0 und nicht wieder auf 1.0
- Wieder ein mechanischer Fehler, aber das Ergebnis bei Verwendung der version 2.0 ist die gleichen zwei Ausnahmen.
- Ich bearbeitet meine Antwort wieder. Ich denke, Sie können, müssen Sie das element provider zu deiner config.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann es mehrere Gründe für dieses:
Ihre Klasse
Movie
ist eine Entität. In diesem Fall posten Sie IhreMovie
Klasse code. Prüfen Sie, ob es ist versehen mit@Entity
. Oder definierenMovie
in Ihrempersistence.xml
.Ich freue mich auf Ihre
persistence.xml
und ich seheMovieBean
innerhalb der Datei. Das ist falsch. Sie nicht brauchen, EJB innerhalb Ihrer Datei. Sie müssen definieren, mit der Klasse der Entität, wieMovie
.Ändern Sie es wie folgt:
Ihre EJB-nicht verwaltet werden. Bedeutet, dass deine EJB nicht implementiert, richtig. In diesem Fall wird es nicht vom container verwaltet und annotation-lookup fehlschlagen. Überprüfen Sie, ob Ihre EJB zugeordnet ist, um einen JNDI-Namen. Sie können dies überprüfen, durch Server-GUI, Server-Start-Log oder 3rd-party-App.
Den Namen Ihres
DataSource
ist falsch.In dieser Zeile
<jta-data-source>java:openejb/Connector/Default JDBC Database</jta-data-source>
Sie nicht brauchen, um das Präfixjava:
. Verwenden Sie nur den JNDI-Namen IhrDataSource
. Überprüfen Sie, ob die JNDI-Namen IhrDataSource
korrekt ist. Sie können dies überprüfen, wie bereits in Punkt#2.Nicht verwenden, JTA und Non-JTA-Datenquellen zusammen. JTA wird verwendet, wenn Sie nicht behandeln, die Transaktion manuell und Non-JTA wird verwendet, wenn Sie brauchen, um zu verarbeiten die Transaktion manuell im code. Verwenden JTA. Das sollte in Ordnung sein.
Ich Hatte genau das gleiche problem während der Verwendung OpenJPA2 mit ähnlicher Struktur.
Die eine, die gelöst meine NullPointer problem wurde verändert
transaction-type="RESOURCE_LOCAL"
zutransaction-type="JTA"
. Obwohl in diesem Fall bekomme ich diese exception:org.apache.openjpa.persistence.PersistenceException: user lacks privilege or object not found
.Korrektur:
Die Letzte Ausnahme ist gelöst, und alle Transaktionen laufen einwandfrei, nachdem ich ordnungsgemäß zugeordnet, die datasource von tomee der persistence.xml
tomee.xml:
persistence.xml:
Vergessen Sie nicht, fügen Sie jdbc-Treiber-lib in der {tomee}/lib-Verzeichnis.
Arbeite ich an einem Projekt mit einer ähnlichen Struktur zu verkaufen. Hier ist der große Unterschied zwischen mein und dein
Haben Sie vielleicht die null-Zeiger-Ausnahme in Ihrem MovieBean Klasse als Sie noch nicht erstellt haben der entitymanager factory. Es wurde nicht instansiated und das ist, warum Sie immer die null-Zeiger-Ausnahme. Dieser code wurde nicht getestet, in Ihrem Fall. Es steht nur zu mir, so dass ich sagte, ich würde es sagen.
BEARBEITEN:
Nach einem Blick auf die tomcat-Webseite über Ihren link dort ist auch
@PersistenceContext
noch EJBs, wie zum Beispiel Tomcat. Aber OP ist mit OpenEJB, also diese Antwort macht alles nur noch schlimmer, als haben Sie zu ändern, eine Menge Dinge mehr, wie manuell starten und beenden Benutzer-Transaktionen, die würden nur vorstellen eine Menge boilerplate-code.@PersistenceContext
war nicht der Fall, und es war nur eine alternative Denkweise statt eine Lösung für das problem.Versuchen, diese in Ihrem EJB:
Außerdem wird Ihre Datei die aufgerufen werden soll persistence.xml nicht persistance.xml und muss unter den Ordner META-INF.
Bei Verwendung eines RESOURCE_LOCAL Datenquelle, die Namen Ihrer entity-Klassen müssen in dieser Datei.
Den Namen der persistence provider sollte auch in dieser Datei:
Edit: Sicherstellen, dass die PersistenceProviderImpl Klasse auf dem Klassenpfad, wenn Ihr code auf dem server ausgeführt wird
unitName="cinema"
, aber es gibt mir die gleichen Ausnahmen.