初始化EntityManager时的NPE

时间:2014-06-14 17:03:17

标签: java-ee jpa netbeans nullpointerexception glassfish

我已经阅读了关于同一主题的数百个答案,但我仍然无法使其正常工作!我用这种方式调用我的EntityManager:

@Stateless
public class MyTest {

@PersistenceContext
private EntityManager entityManager;

public Long create(MyUser user) {
    entityManager.persist(user);
    return user.getId();
}  
}

然后我以这种方式通过REST Web服务调用此类:

@Path("/myapp/{username}")
@ApplicationScoped
public class MyResource implements Serializable {

private static final long serialVersionUID = 1L;

MyTest service = new MyTest();

@POST
@Consumes({"application/json"})
@Produces({"text/plain"})
public String create(@Valid MyUser user) {

    MyUser testUser = new MyUser();
    //testUser.setParams(some_parameters)

    return service.create(testUser).toString();

    return "";
}

}

当我发出POST请求时,我总是得到一个NullPointerException,因为EntityManager总是为空。

在我的persistence.xml下面,但我想问题不存在,因为我的应用程序部署得很好并且在数据库中完美地创建了表。

<persistence version="2.0" 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">     <persistence-unit name="myserver-unit" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/MyData</jta-data-source>
<properties>
  <property name="javax.persistence.schema-generation.create-source" value="metadata-then-script"/>
  <property name="javax.persistence.schema-generation.drop-source" value="metadata-then-script"/>
  <property name="javax.persistence.schema-generation.create-script-source" value="create-script.sql"/>
  <property name="javax.persistence.schema-generation.drop-script-source" value="drop-script.sql"/>
  <property name="javax.persistence.sql-load-script-source" value="load-script.sql"/>
  <property name="eclipselink.logging.level" value="FINEST"/>
  <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
  <property name="eclipselink.jdbc.user" value="APP"/>
  <property name="eclipselink.jdbc.password" value="APP"/>
</properties>

请你给我一个提示?有没有其他方法来初始化EntityManager?我正在使用Netbeans 8和GlassFish 4.

我已经遇到了一些注射问题,这就是为什么我以“标准方式”调用MyTest中的方法,而不是注入它。

1 个答案:

答案 0 :(得分:1)

您无法以这种方式实例化容器管理对象(如EJB)。您必须通过使用@EJB注释来注入EJB。除非您想使用手动JNDI查找,否则这是唯一的方法,但不需要这样做。

此外,您可能应该将@ApplicationScoped更改为@RequestScoped作为JAX-RS端点全​​部 - 或者将MyTest从@Stateless更改为@Singleton,否则您在@ApplicationScoped和@Stateless之间存在上下文不匹配