初始化EntityManager时的NPE



我已经阅读了数百个关于同一主题的答案,但我仍然无法使它工作!我用这种方式调用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中以"标准方式"调用方法,而不是注入它。

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

另外,你可能应该将@ApplicationScoped更改为@RequestScoped作为JAX-RS端点,或者将MyTest从@Stateless更改为@Singleton,否则你会在@ApplicationScoped和@Stateless之间产生上下文不匹配

相关内容

  • 没有找到相关文章

最新更新