我的配置中有一個攔截器,我想禁止訪問其他用戶的資源。在 WebMvcConfig(實現 WebMvcConfigurer)中,我有:@Overridepublic 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.謝謝您的幫助。
2 回答

UYOU
TA貢獻1878條經驗 獲得超4個贊
我使用 getOne 方法在我的服務中按 id 檢索我的文件夾?,F在使用 folderRepository.findById(id) 并且現在可以使用:
public Folder findById(Long id) {
Optional<Folder> folder = folderRepository.findById(id);
if (!folder.isPresent())
return null;
return folder.get();
}

繁花不似錦
TA貢獻1851條經驗 獲得超4個贊
您很Folder
可能正在檢索一個實體,而無需在此處的一個事務下獲取任何依賴項:
Folder folder = folderService.findById(id);
然后,當您嘗試訪問時folder.getOwner()
,沒有獲取 Owner 依賴項,并且持久性提供程序嘗試從數據庫中延遲加載它:
if (folder.getOwner().getId().equals(user.getId())) { return true; }
問題在于它folder
超出了事務范圍和一個分離的實體。
我建議獲取方法Owner
內部folderService.findById(id)
或將查詢和條件置于相同的事務方法下。
添加回答
舉報
0/150
提交
取消