使用@RequestScoped和@Produces将用户实体注入Jersey处理程序

时间:2015-02-04 07:05:39

标签: java rest jersey ejb cdi

用户实体类:

@Entity
public class User implements Serializable {

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    public List<Site> sites;

访问数据库的Facade类:

@Stateless
public class UserFacade extends AbstractFacade<User, Long> {

    @PersistenceContext
    private EntityManager em;

    ...
}

用户注入的资源类:

@RequestScoped
public class Resource {

    @Inject
    UserFacade userFacade;

    @Inject
    HttpServletRequest request;

    @Produces
    public User getUser() {
        final String name = request.getUserPrincipal().getName();
        // ... find user in database ...
    }

}

泽西经理:

@Stateless
@Path("/sites")
public class Sites {    

    @EJB
    SiteFacade siteFacade;

    @Inject
    User user;

    ...

现在出现问题:

当我想访问user.sites列表时,我得到延迟加载异常。但显然是因为UserScoped提供者注入了User,它应该使用相同的EntityManager会话刷新每个请求。正确?

无论如何,我将每个休息请求的用户实体注入Rest处理程序类?

1 个答案:

答案 0 :(得分:1)

EntityManager绑定到事务,而不是请求范围。

因此,User生产者方法和您的Sites业务方法在两个不同的交易中被调用,这解释了LazyLoadException