【问题标题】:Use @RequestScoped and @Produces to Inject User Entity into the Jersey handler使用 @RequestScoped 和 @Produces 将用户实体注入 Jersey 处理程序
【发布时间】:2023-03-31 11:28:01
【问题描述】:

用户实体类:

@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;

    ...
}

用户注入的资源类:

@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 列表时,我遇到了延迟加载异常。但显然因为由 RequestScoped 提供者注入的用户,它应该使用相同的 EntityManager 会话刷新每个请求。对吧?

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

【问题讨论】:

  • 向我们展示// ...在数据库中查找用户...代码

标签: java rest jersey ejb cdi


【解决方案1】:

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

所以User producer 方法和您的Sites 业务方法在两个不同的事务中调用,这就解释了LazyLoadException

【讨论】:

  • 有没有办法处理这种情况?在我使用 EJB 之前,我通过创建一个 ServletFilter 来在 servlet 调用之后提交转换(不使用 JTA)。因此,每个请求我有零个或一个事务,处理这些问题非常容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
相关资源
最近更新 更多