无法初始化代理 - 没有会话,在 Spring 拦截器内

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


@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 中,我有一个 preHandle 方法获取访问的文件夹并检查其所有者:


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.

谢谢您的帮助。


www说
浏览 181回答 2
2回答

UYOU

我使用 getOne 方法在我的服务中按 id 检索我的文件夹。现在使用 folderRepository.findById(id) 并且现在可以使用:public Folder findById(Long id) {&nbsp; &nbsp; Optional<Folder> folder = folderRepository.findById(id);&nbsp; &nbsp; if (!folder.isPresent())&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; return folder.get();}

繁花不似锦

您很Folder可能正在检索一个实体,而无需在此处的一个事务下获取任何依赖项:Folder&nbsp;folder&nbsp;=&nbsp;folderService.findById(id);然后,当您尝试访问时folder.getOwner(),没有获取 Owner 依赖项,并且持久性提供程序尝试从数据库中延迟加载它:if&nbsp;(folder.getOwner().getId().equals(user.getId()))&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;}问题在于它folder超出了事务范围和一个分离的实体。我建议获取方法Owner&nbsp;内部folderService.findById(id)或将查询和条件置于相同的事务方法下。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java