Прежде всего, я пытаюсь предотвратить рекурсию в JSON, когда получаю User
сущность. Для этого я добавил @JsonIdentityInfo
аннотацию к моему User
классу. Он работает как ожидается для сериализации (когда я получаю User
), но при десериализации (при регистрации User
) Джексон возвращает это:
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: No Object Id found for an instance of `.entity.User`, to assign to property 'id'; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: No Object Id found for an instance of `.entity.User`, to assign to property 'id'
at [Source: (PushbackInputStream); line: 13, column: 1]]
User.kt
@Entity
@Table(name = "user")
@Audited
@EntityListeners(AuditingEntityListener::class)
@Validated
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator::class, property = "id", scope = Int::class)
data class User(
@field:Id
@field:GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int,
@Valid
@Size(
min = 4,
message = "Username '\${validatedValue}' should be at least {min} characters long"
)
@NotEmpty(message = "asd")
var username: String = "",
...
@field:OneToOne(cascade = [CascadeType.ALL], optional = true)
var userInfo: UserInfo? = null
)
JSON Я отправляю на десериализацию (работает при удалении @JsonIdentityInfo
):
{
"username": "qwert",
"password": "tyui",
"email": "asdasd",
"phone": ""
}
Метод, использованный для регистрации:
@PostMapping("/users/signup")
fun addUser(@RequestBody @Valid user: User): JSendResponse<Unit> {
user.password = passwordEncoder.encode(user.password)
userService.save(user)
return JSendResponse(data = Unit)
}
UPD: Решением этой проблемы было явное задание поля id
в Json, поскольку оно генерируется на уровне постоянства. Но я не хочу устанавливать это явно, потому что веб-интерфейс не знает id
нового объекта.