java - 使用 @RequestScoped 和 @Produces 将用户实体注入(inject) Jersey 处理程序

标签 java rest jersey ejb cdi

用户实体类:

@Entity
public class User implements Serializable {

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

访问数据库的外观类:

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

    @PersistenceContext
    private EntityManager em;

    ...
}

用户注入(inject)的资源类:

@RequestScoped
public class Resource {

    @Inject
    UserFacade userFacade;

    @Inject
    HttpServletRequest request;

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

}

和 Jersey 处理程序:

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

    @EJB
    SiteFacade siteFacade;

    @Inject
    User user;

    ...

现在的问题是:

当我想访问 user.sites 列表时,出现延迟加载异常。但显然因为 User 由 RequestScoped 提供者注入(inject),它应该使用相同的 EntityManager session 刷新每个请求。对吗?

我是否可以将每个休息请求的用户实体注入(inject)休息处理程序类?

最佳答案

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

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

关于java - 使用 @RequestScoped 和 @Produces 将用户实体注入(inject) Jersey 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28315409/

相关文章:

java - Tomcat:无法解析 java.util.Map$Entry

python - 为什么这个 django-rest-swagger API 文档不能正常显示/工作?

rest - 为长期任务创建 REST API 的最佳方式?

java - Spring Boot - 不明确的映射

tomcat - Jersey 支持 CORS 吗?

java - DropWizard 认证领域

java - 使用@JsonTypeInfo为什么不能省略多态字段?

java - volatile 和同步化解决竞争条件: Singleton Member Field

java - 在处理事物时创建模态 JDialog

java - 由 : java.net.NoRouteToHostException: No route to host 引起