出于安全原因,我需要检查用户是否是特定组的成员。但是,我总是遇到lazyinitializationexception,找不到解决方案。
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: User.groups, could not initialize proxy - no Session
我试着在任何可能的地方使用@transactional注解,但没有用。当然,它可以很好地进行急切的初始化,但我不想使用它。
控制器:
@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:事务性在应用程序的其他部分工作得很好,所以我不认为这是配置问题,或者可能是配置问题。而且,即使直接在decider方法中使用hibernate.initialize()初始化,仍然会失败。
我想,这是因为@preauthorize不能直接访问这个方法,所以spring不能创建代理。然而,我仍然不知道如何修复它,甚至不知道我是否在这里。
1条答案
按热度按时间k5hmc34c1#
使用
fetch = FetchType.EAGER
而不是FetchType.LAZY
.