使用CDI+;WS/RS+;JPA将构建一个应用程序
这是用户管理器impl使用CDI+;WS/RS+;JPA将构建一个应用程序,jpa,jakarta-ee,java-ee-6,jax-rs,cdi,Jpa,Jakarta Ee,Java Ee 6,Jax Rs,Cdi,这是用户管理器impl @Path(value = "/user") @Stateless public class UserService { @Inject private UserManager manager; @Path(value = "/create") @GET @Produces(value = MediaType.TEXT_PLAIN) public String doCreate(@QueryParam(value = "
@Path(value = "/user")
@Stateless
public class UserService {
@Inject
private UserManager manager;
@Path(value = "/create")
@GET
@Produces(value = MediaType.TEXT_PLAIN)
public String doCreate(@QueryParam(value = "name") String name) {
manager.createUser(name);
return "OK";
}
}
问题是如果我没有将UserService标记为@Stateless,那么manager字段为null
但是如果我将@Stateless标记为,我可以将manager字段注入,并且应用程序可以工作,因为我可以将数据保存到数据库中
只是想知道,这背后的原因是什么
这是连接应用程序的首选方式吗
嗯,我想把EntityManager拉出来给制作人,这样就可以共享了
问题是如果我没有将UserService标记为@Stateless,那么manager字段为null
要进行注入,类必须是托管组件,如企业bean、servlet、过滤器、JSF托管bean等,或者CDI托管bean(这是JavaEE6的新部分,您可以使用CDI将任何类设为托管bean)
那么,如果您不将JAX-RS端点设为EJB,如何启用注入?这在以下章节中得到了很好的解释:
CDI管理bean有两种方法
已启用以下选项:
@ManagedBean
和可选注释
使用范围注释@RequestScoped
(no@ManagedBean
(是必需的)EntityManager
,其生存期范围为单个事务(事务范围的持久性上下文)。换句话说,不要共享它(也不要担心为每个请求打开和关闭它,这不是一个昂贵的操作)
工具书类
- JPA2.0规范
- 第7.6节“容器管理的持久性上下文”
- 第7.6.1节“容器管理的事务作用域持久性上下文”
- 第7.6.2节“容器管理的扩展持久性上下文”
@PersistenceContext
的组件范围内只定义了一个持久化单元,则不需要在@PersistenceContext
中指定单元名称,否则需要指定它。
public class UserManager {
@PersistenceContext(unitName = "shop")
private EntityManager em;
public void createUser(String name) {
User user = new User();
user.setName(name);
// skip some more initializations
em.persist(user);
}
}