Hoje fiz uma pergunta, criei um modelo de usuário.
@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;
No meu serviço, gostaria de obter o resultado quando avalio o método:
User updateUser = userRepository.getById(userId)
.orElseThrow(() -> new ResourceNotFoundException("L'utilisateur n'existe pas avec l'id: " + userId));
Aqui está meu getById(userId)
@Query(value = "SELECT * FROM _user u where u.id = :id", nativeQuery = true)
Optional<User> getById(int id);
Quando avaliei o método para obter resultado, obtive isto:
Mas não há problemas, porque meu código continua sendo executado. Coisas estranhas , no console, não tenho problemas com o StackOverflow.
Quero entrar no modo de depuração e avaliar o resultado porque recebi um ERROR [https-jsse-nio-443-exec-3] c.d.x.ExceptionHandler: Could not commit JPA transaction
erro.
EDITAR
Adicione o fullstacktrace e meu userId será int(1), não uma String.
Espero que alguém tenha tido esse bug e o tenha resolvido!
Muito obrigado
Atenciosamente
A causa raiz provavelmente é esse problema do lombok, já que
toString()
o método é invocado por padrão pelo depurador do console e falha devido à recursão infinita, o que causa o StackOverflowError.A causa raiz disso em seu exemplo específico é a
Uma solução alternativa para resolver esse problema seria excluir o campo
toString()
que contém referências de volta ao objeto original, o que causa recursão infinita. Em algum lugar no seuToken.class
deve haver um campo:Você pode usar a anotação lombok
@ToString.Exclude
comoAgora,
toString()
o método fornecido pelo lombokUser.class
será capaz de imprimir a listaToken.class
sem causar recursão infinita, já que a referência ao objeto original não será considerada naquele objetotoString()
.