我已经阅读了关于同一主题的数百个答案,但我仍然无法使其正常工作!我用这种方式调用我的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中的方法,而不是注入它。
答案 0 :(得分:1)
您无法以这种方式实例化容器管理对象(如EJB)。您必须通过使用@EJB注释来注入EJB。除非您想使用手动JNDI查找,否则这是唯一的方法,但不需要这样做。
此外,您可能应该将@ApplicationScoped更改为@RequestScoped作为JAX-RS端点全部 - 或者将MyTest从@Stateless更改为@Singleton,否则您在@ApplicationScoped和@Stateless之间存在上下文不匹配