我已经阅读了数百个关于同一主题的答案,但我仍然无法使它工作!我用这种方式调用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之间产生上下文不匹配