我今天问了一个问题,我创建了一个用户模型。
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "_user")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class User implements UserDetails {
@Id
@GeneratedValue
private Integer id;
private String firstname;
private String lastname;
@NotNull
@Column(unique=true)
private String email;
@NotNull
@Column(unique=true)
private String usrname;
@NotNull
@ColumnDefault("'img/avatar1.jpg'")
private String avatar;
@JsonIgnore
private String password;
@Enumerated(EnumType.STRING)
private Role role;
@JsonIgnore
@OneToMany(mappedBy = "user")
private List<Token> tokens;
在我的服务中,我想在评估方法时获得结果:
User updateUser = userRepository.getById(userId)
.orElseThrow(() -> new ResourceNotFoundException("L'utilisateur n'existe pas avec l'id: " + userId));
这是我的 getById(用户 ID)
@Query(value = "SELECT * FROM _user u where u.id = :id", nativeQuery = true)
Optional<User> getById(int id);
当我评估方法以获得结果时,我得到了这个:
但没有问题,因为我的代码继续执行..奇怪的是,在控制台中,我没有 StackOverflow 问题..
由于我遇到了错误,我想进入调试模式并评估结果ERROR [https-jsse-nio-443-exec-3] c.d.x.ExceptionHandler: Could not commit JPA transaction
。
编辑
添加 fullstacktrace 并且我的 userId 是 int(1) 而不是字符串。
我希望有人遇到过这个错误并解决了它!
多谢
此致
根本原因可能是这个 lombok 问题,因为
toString()
该方法默认从控制台调试器调用,并且由于无限递归而失败,从而导致 StackOverflowError。在您的具体例子中,造成这种情况的根本原因是
解决此问题的一种解决方法是排除包含
toString()
对原始对象的引用(这会导致无限递归)的字段。您的某个地方Token.class
应该有一个字段:您可以在此处使用 lombok 注释
@ToString.Exclude
作为现在,
toString()
lombok 提供的方法User.class
将能够打印列表而Token.class
不会导致无限递归,因为在该对象中不会考虑对原始对象的引用toString()
。