我在WildFly 10上运行了Java8 / Spring4 webapp,我想使用JPA 2.1。
我创建了一个persitence.xml文件,并使用从jboss reference guide中获取的小代码段创建了一个dao类:
@Stateful // will use container managed transactions
public class UserDao {
@PersistenceContext(unitName = "customerPU") // default type is PersistenceContextType.TRANSACTION
EntityManager em;
public customer createCustomer(String name, String address) {
Customer customer = new Customer(name, address);
em.persist(customer);
}
不幸的是,实体经理没有按照预期注入。我读了in a tutorial:
@PersistenceContext注释可用于任何CDI bean,EJB, Servlet,Servlet侦听器,Servlet过滤器或JSF ManagedBean。
我认为使用@Stateful注释会自动使我的dao类成为一个(ej)bean,因此注入将由jboss容器进行,但它不会发生,当我得到NullPointerException
时调用.persist
方法。为什么这样,我可以解决它吗?我已经尝试使用@Stateless
注释而是尝试使用PersistenceContextType.EXTENDED而不是默认的TRANSACTIONAL注释,但这似乎没有改变任何东西。请清楚地描述这个问题的解决方案是否需要额外的库(spring,hibernate),或者只是配置问题(persistence.xml,standalone.xml ......)
我在记录中看到了这一点,我不确定它的含义:
INFO [] [org.jboss.as.ejb3.deployment] WFLYEJB0473:JNDI绑定 会话bean在部署单元的部署中名为“UserDao” “BasicWebapp.war”'如下:
Java的:全球/ BasicWebapp / userDAO的com.company.project.data.UserDao Java的:应用程序/ BasicWebapp / userDAO的com.company.project.data.UserDao Java的:模块/ userDAO的com.company.project.data.UserDao java:global / BasicWebapp / UserDao java:app / BasicWebapp / UserDao 的java:模块/ userDAO的
我知道我的数据源和persistence.xml已经正确配置,因为我设法通过将代码片段放在我的ServletContextListener
类中来完成注入工作(就像一个小测试,我知道它没有有理由在那里)。仅供参考,这里是简洁的persistence.xml文件,它主要使用jboss提供的默认值:
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="customerPU" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/customerdb</jta-data-source>
<class>com.company.project.data.Customer</class>
</persistence-unit>
</persistence>