Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CDI+;WS/RS+;JPA将构建一个应用程序_Jpa_Jakarta Ee_Java Ee 6_Jax Rs_Cdi - Fatal编程技术网

使用CDI+;WS/RS+;JPA将构建一个应用程序

使用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 = "

这是用户管理器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 = "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有两种方法 已启用以下选项:

  • 由CDI实例化,生命周期由Jersey管理。注释
    @ManagedBean
    和可选注释 使用范围注释

  • 由CDI实例化和管理。使用CDI范围注释进行注释, 像
    @RequestScoped
    (no
    @ManagedBean
    (是必需的)

  • 我还建议查看下面的参考资料

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

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

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

    分享什么?为什么?在您的情况下,您应该使用
    EntityManager
    ,其生存期范围为单个事务(事务范围的持久性上下文)。换句话说,不要共享它(也不要担心为每个请求打开和关闭它,这不是一个昂贵的操作)

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

    Singleton注释将有助于:

    非常好和详细的答案,还有一件事需要澄清,EM的“共享”,假设我有另一个使用相同PU的OrderService,我不想重复@PersistenceContext(unitName=“shop”),而是希望它作为@InjectEntityManager,我该怎么做呢?@Dapeng AFAIK,如果在使用
    @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);
        }
    }