代码之家  ›  专栏  ›  技术社区  ›  Dapeng

使用CDI+WS/RS+JPA构建应用程序

  •  5
  • Dapeng  · 技术社区  · 14 年前
    @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";
        }
    }
    

    下面是用户管理器impl

    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);
        }
    }
    

    但是如果我标记@Stateless,我可以让manager字段被注入,并且应用程序可以像我可以将数据保存到db中一样工作

    只是想知道,这背后的原因是什么?

    这是连接应用程序的首选方式吗?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Ken Y-N    10 年前

    问题是,如果我没有将UserService标记为@Stateless,那么manager字段为null

    托管组件 例如企业bean、servlet、过滤器、JSF管理的bean等等 CDI托管bean (这是JavaEE6的新部分,您可以使用CDI使任何类成为托管bean)。

    所以,如果您不将JAX-RS端点设置为EJB,那么如何启用注入?这很好地解释了 JAX-RS and CDI integration using Glassfish v3 :

    CDI管理bean有两种方法 已启用:

    1. 由CDI实例化,生命周期由Jersey管理。注释 @ManagedBean 以及可选的注释

    2. 由CDI实例化和管理。使用CDI范围注释进行注释, 喜欢 @RequestScoped (否) @管理Bean

    这是连接应用程序的首选方式吗?

    我会同意的。CDI很好而且。。。你不喜欢打针吗?

    嗯,我想把EntityManager拉出来给一个制作人,这样就可以共享了

    分享什么?为什么?在你的情况下,你应该使用 EntityManager 其生存期范围为单个事务(a

    • JPA2.0规范
      • 第7.6节“容器管理的持久性上下文”
      • 第7.6.1节“容器管理的事务作用域持久性上下文”
      • 第7.6.2节“容器管理的扩展持久性上下文”

    资源

        2
  •  0
  •   Benny Code    11 年前