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.
谢谢你的帮助
# 1 楼答案
您正在检索
Folder
实体,很可能在一个事务下没有任何依赖项获取:然后,当您尝试访问
folder.getOwner()
时,没有获取所有者依赖项,持久性提供程序试图从数据库中延迟加载它:问题是
folder
超出了事务范围,是一个分离的实体我建议在
folderService.findById(id)
方法中获取Owner
,或者将查询和条件放在同一个事务方法下# 2 楼答案
我使用getOne方法在我的服务中按id检索我的文件夹。现在使用folderRepository。findById(id)目前可以使用: