0

这是我的 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();
}

MoviesServlet像这样使用这个 MovieBean:

@WebServlet("/MoviesServlet")
public class MoviesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

@EJB
private MovieBean mb;

private List<Movie> getMovies() {
    return mb.getAllMovies();
}

在我doGet的方法中,我使用该getMovies方法来获取所有电影的列表。但是,我得到以下例外:

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)

我的persistance.xml文件配置如下:

<?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>

我尝试更改它(尝试使用此处显示的那个)但它甚至没有启动服务器(说时间限制已超过,即使我尝试将其更改为 200 秒)。我使用 Java7、OpenEJB 和 TomEE。

编辑 1: 我将我的更改persistence.xml为:

    <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>

尝试@PersistenceContext(unitName="cinema")并启动了服务器,但它给了我同样的例外。

4

4 回答 4

2

这可能有几个原因:

  1. 你的班级Movie不是一个实体。在这种情况下,请发布您的Movie课程代码。检查它是否带有注释@Entity。或者Movie在你的persistence.xml.

    我正在查看您的文件persistence.xml,并且正在查看MovieBean文件中的内容。这是错误的。您的文件中不需要 EJB。您需要定义类似于实体的类Movie

    像这样改变它:

    <class>YourPackagePath.Movie</class>
    
  2. 您的 EJB 不受管理。意味着您的 EJB 无法正确部署。在这种情况下,它将不受容器管理,并且注解查找将失败。检查您的 EJB 是否映射到 JNDI 名称。您可以通过服务器 GUI、服务器启动日志或第 3 方应用程序检查这一点。

  3. 你的名字DataSource是错误的。

    在这一行<jta-data-source>java:openejb/Connector/Default JDBC Database</jta-data-source>中,您不需要前缀java:. 仅使用您的DataSource. 再次检查您的 JNDI 名称DataSource是否正确。您可以按照第 2 点中的说明进行检查。

  4. 不要同时使用 JTA 和非 JTA 数据源。当您不手动处理事务时使用 JTA,当您需要在代码中手动处理事务时使用非 JTA。使用 JTA。那应该没问题。

于 2013-05-20T03:15:52.743 回答
2

在使用具有类似结构的 OpenJPA2 时,我遇到了完全相同的问题。解决我的 NullPointer 问题的那个正在更改transaction-type="RESOURCE_LOCAL"transaction-type="JTA". 虽然在这种情况下我得到了这个例外:org.apache.openjpa.persistence.PersistenceException: user lacks privilege or object not found.

更正:在我将数据源从 tomee 正确映射到 persistence.xml 后,最后一个异常已解决,所有事务都运行良好

tomee.xml:

<Resource id="mydatabaseDS" type="DataSource">
    JdbcDriver org.postgresql.Driver
    JdbcUrl jdbc:postgresql://localhost:5432/mydatabase
    UserName myuser
    Password mypassword
    JtaManaged true
</Resource>

持久性.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/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">

    <persistence-unit name="myPU" transaction-type="JTA">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>mydatabaseDS</jta-data-source>
    </persistence-unit>
</persistence>

不要忘记将 jdbc 驱动程序库添加到 {tomee}/lib 目录中。

于 2013-09-18T18:56:11.323 回答
0

我正在开发一个与您的结构相似的项目。这是我和你的主要区别

protected static EntityManagerFactory
 em=Persistence.createEntityManagerFactory("cinema");

由于您尚未创建实体管理器工厂,您可能会在 MovieBean 类中遇到空指针异常。它还没有被实例化,这就是你得到空指针异常的原因。此代码尚未在您的情况下进行测试。这对我来说很突出,所以我说我会说。

编辑:通过您的链接查看tomcat网站后,还有

@PersistenceContext(unitName = "cinema", type = PersistenceContextType.EXTENDED)
 private EntityManager em;
于 2013-05-19T22:37:48.993 回答
0

在你的 EJB 中试试这个:

@PersistenceContext(unitName="cinema")
private EntityManager em;

此外,您的文件应该称为 persistence.xml,而不是 persistence.xml,并且需要位于 META-INF 文件夹下。

使用 RESOURCE_LOCAL 数据源时,必须在此文件中提供实体类的名称。

持久性提供者的名称也应该在这个文件中给出:

<provider> org.apache.openjpa.persistence.PersistenceProviderImpl </provider>

编辑:当您的代码在服务器上运行时,确保 PersistenceProviderImpl 类位于类路径中

于 2013-05-19T20:41:57.943 回答