spring - Spring @PreAuthorize 抛出 LazyInitializationException 从 Hibernate 访问惰性数据
问题描述
出于安全原因,我需要检查用户是否是特定组的成员。但是,我一直收到 LazyInitializationException 并且找不到解决方案。
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: User.groups, could not initialize proxy - no Session
我尝试在任何可能的地方使用 @Transactional 注释,但这没有帮助。它肯定适用于 Eager 初始化,但我不想使用它。
控制器:
@MessageMapping("/group/chat")
@PreAuthorize("@decider.checkIfGroupMember(#user, #chatMessageRequest.getGroupId())")
public ChatMessageRequest processMessage(
@Payload ChatMessageRequest chatMessageRequest,
@AuthenticationPrincipal User user) {
return chatMessageService.processMessage(chatMessageRequest, user);
}
决策者类:
@Component
public class Decider {
@Transactional
public boolean checkIfGroupMember(Object principal, Integer groupId) {
User user = (User) principal;
Set<Group> groups = user.getGroups();
for (Group group : groups) {
if(group.getId().equals(groupId)) {
return true;
}
}
return false;
}
}
这对用户来说很重要:
@Data
@Builder
@Accessors(chain = true)
@Table(name = "users")
public class User extends BasicEntity {
@Column(nullable = false)
private String name;
@Column(nullable = false, unique = true)
private String email;
@Column
private String password;
@ManyToMany(mappedBy = "users", fetch = FetchType.LAZY)
@JsonIgnore
private Set<Group> groups = new HashSet<>();
}
有人可以帮助我吗?提前致谢!
UPD:事务在应用程序的其他部分工作正常,所以我认为这不是配置问题,也可能是。此外,即使在决策程序方法中直接使用 Hibernate.initialize() 进行初始化仍然失败。
我想,这是因为 @PreAuthorize 不直接访问该方法,所以 Spring 无法创建代理。但是,我仍然不知道如何解决它,甚至不确定我是否在这里。
解决方案
使用fetch = FetchType.EAGER
而不是FetchType.LAZY
.
推荐阅读
- excel - VBA 宏返回连续的月末,最好不循环
- angular - 在 Angular TS 文件中找不到 Angular Input 属性
- dart - 如何修复未捕获的错误:需要一个“LIElement”类型的值,但得到一个“_JsonMap”类型的值
- r - 如何在R中格式化SPEI包的硬编码绘图功能的x轴?
- eslint - ESLint 抱怨 ESLint 插件没有安装在 monorepo 中
- excel - 我不确定我的代码在 vlookup 上有什么问题
- c - 在执行线程时更改 C 线程参数
- regex - 用于匹配 lucene 中任意 2 个字母 + 任意 6 个数字的正则表达式
- python - 从 qt-designer ui 文件以编程方式添加到由 pyuic 创建的窗口
- r - 使用 sp::merge() 作为函数在 R 中拆分应用和组合的更好方法