首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >角色集合无法初始化代理-没有仅来自筛选器的会话。

角色集合无法初始化代理-没有仅来自筛选器的会话。
EN

Stack Overflow用户
提问于 2022-03-20 13:16:37
回答 1查看 379关注 0票数 0

我有一个亲戚ManyToMany:

代码语言:javascript
运行
复制
@Entity
@Data
@Table(name = "usuarios")
public class Usuario implements Serializable{
...
    @JsonIgnoreProperties({"usuario", "hibernateLazyInitializer", "handler"})
    @ManyToMany(fetch=FetchType.LAZY, cascade = CascadeType.MERGE)
    @JoinTable(name="usuarios_roles", 
        joinColumns= @JoinColumn(name="usuario_id"),
        inverseJoinColumns=@JoinColumn(name="role_id"),
        uniqueConstraints = {@UniqueConstraint(columnNames = {"usuario_id","role_id"})})
    private List<Role> role = new ArrayList<>();
...
}

@Entity
@Data
@Table(name = "roles")
public class Role implements Serializable{
.....
    @JsonIgnoreProperties({"usuarios","hibernateLazyInitializer", "handler"})
    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "role")
    private List<Usuario> usuario = new ArrayList<>();
...
}

当我将它作为一个简单的rest运行时,它完美地工作,它返回用户和他的所有角色。

问题是当我从过滤器运行它时:

代码语言:javascript
运行
复制
public class CustomFilter extends OncePerRequestFilter {
    @Autowired
    private IUsuarioService usuarioService;
    
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        try {
            if(usuarioService == null){
                ServletContext servletContext = request.getServletContext();
                WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
                usuarioService = webApplicationContext.getBean(IUsuarioService.class);
            }
            String[] path = request.getRequestURI().split("/");
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            Usuario usuario = usuarioService.findByEmail(authentication.getName());
            if(usuarioService.existsPermission(request.getMethod(), path[2], authentication.getName())) {
                filterChain.doFilter(request, response);
            } else {
                response.sendError(HttpServletResponse.SC_FORBIDDEN);
            }           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

这项服务是:

代码语言:javascript
运行
复制
@Override
public Boolean existsPermission(String method, String rest, String email) {
    Usuario usuario = usuarioDao.findByEmail(email);
    Rest restcontroller = new Rest();
    restcontroller = restDao.findByMetodoAndRestcontroller(method, rest);
    for(Role role : usuario.getRole()) {
        return restDao.existsPermission(restcontroller.getId(), role.getId());
    }
    return false;
}

此错误:

代码语言:javascript
运行
复制
failed to lazily initialize a collection of role: iteam.ronald.project.models.entity.Usuario.role, could not initialize proxy - no Session

在调试模式下,getRole()返回以下错误:

代码语言:javascript
运行
复制
Exception occurred: com.sun.jdi.InvocationException: Exception occurred in target VM occurred invoking method..

这让我假设我启用userService从这个过滤器使用它的方式是不正确的。我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2022-03-21 11:32:09

您得到这条消息是因为在事务之外调用usario.getRole,而fetchType是惰性的。

要解决这个问题,您可以:

  • 将existsPermission放在事务中,或
  • 在usuarioDao.findByEmail中执行如下操作:

代码示例:

代码语言:javascript
运行
复制
public Usuario findByEmail(String email) {
  Usuario usuario;
  //fetch usuario
  //load roles
  usuario.getRole().size();
  return usuario;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71547088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档