【发布时间】:2021-04-03 19:26:42
【问题描述】:
我正在尝试获取用户登录后的个人资料数据(来自登录成功过滤器),但我看到延迟加载数据时出现异常。请看以下示例代码:
AuthenticationSuccessHandler.java
@Component
public class AuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Autowired
private UserService userService;
@Autowired
private Gson gson;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws ServletException, IOException {
User user = (User) authentication.getPrincipal();
UserLoginResponseDto userLoginResponseDto = userService.login(user.getUsername());
response.setStatus(HttpStatus.OK.value());
response.setContentType("application/json; charset=UTF-8");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
response.getWriter().println(gson.toJson(userLoginResponseDto));
response.getWriter().flush();
clearAuthenticationAttributes(request);
}
}
UserService.java
public class UserService implements UserDetailsService, TokenService {
@Autowired
private UserRepository userRepository;
@Transactional(readOnly = true)
public UserLoginResponseDto login(String email) {
Optional<UserModel> userOptional = userRepository.findByEmailIgnoreCase(email);
UserModel userModel = userOptional.get();
UserLoginResponseDto userLoginResponseDto = userModel.toUserLoginResponseDto();
return userLoginResponseDto;
}
}
UserModel.java
public class UserModel {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, unique = true, updatable = false)
private UUID id;
[A FEW MORE FIELDS]
@Column(length = 256, nullable = false, unique = true, updatable = false)
private String email;
@OneToMany(cascade = { CascadeType.ALL })
private List<RoleModel> roleModels;
public UserLoginResponseDto toUserLoginResponseDto() {
return new UserLoginResponseDto().setId(id).setEmail(email).setRoles(roleModels);
}
}
UserLoginResponseDto.java
public class UserLoginResponseDto {
private UUID id;
private String email;
private List<RoleModel> roles;
}
在AuthenticationSuccessHandler 中序列化 UserLoginResponseDto 类型的对象时,我看到以下错误消息 -
org.hibernate.LazyInitializationException: 延迟初始化角色集合失败:UserModel.roleModels,无法初始化代理 - 没有会话
QQ - 如何在不使用以下任何技术的情况下正确解决此问题?
- [ANTIPATTERN] 在视图中打开
- [ANTIPATTERN] hibernate.enable_lazy_load_no_trans
- FetchType.EAGER
【问题讨论】: