有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法在Spring拦截器内初始化proxy no会话

我的配置中有一个拦截器,我想禁止访问其他用户的资源。在WebMvcConfig(实现WebMVCConfiguer)中,我有:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new FolderInterceptor(userService, folderService))
            .addPathPatterns(Mapping.FOLDER_MAPPING + "/{id}",
                    Mapping.UPDATE_FOLDER_MAPPING + "/{id}",
                    Mapping.DELETE_FOLDER_MAPPING + "/{id}",
                    Mapping.DOWNLOAD_FOLDER_MAPPING + "/{id}");

}

在我的FolderInterceptor中,我有一个预处理方法获取访问的文件夹并检查其所有者:

Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
Long id = Long.valueOf((String) pathVariables.get("id"));

User user = userService.getLoggedAccount();

if (folderService.existsById(id)) {
    Folder folder = folderService.findById(id);

    if (folder.getOwner().getId().equals(user.getId())) {
        return true;
    }
    else {
        response.sendError(403, "Unauthorized");
        return false;
    }
}
else {
    response.sendError(404, "Folder does not exist");
    return false;
}

如果我打印文件夹对象,那一行也会出现同样的错误

org.hibernate.LazyInitializationException: could not initialize proxy.

谢谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

    您正在检索Folder实体,很可能在一个事务下没有任何依赖项获取:

    Folder folder = folderService.findById(id);
    

    然后,当您尝试访问folder.getOwner()时,没有获取所有者依赖项,持久性提供程序试图从数据库中延迟加载它:

    if (folder.getOwner().getId().equals(user.getId())) {
        return true;
    }
    

    问题是folder超出了事务范围,是一个分离的实体

    我建议在folderService.findById(id)方法中获取Owner,或者将查询和条件放在同一个事务方法下

  2. # 2 楼答案

    我使用getOne方法在我的服务中按id检索我的文件夹。现在使用folderRepository。findById(id)目前可以使用:

    public Folder findById(Long id) {
    
        Optional<Folder> folder = folderRepository.findById(id);
    
        if (!folder.isPresent())
            return null;
    
        return folder.get();
    }