Я проектирую службу REST и сталкиваюсь с проблемой, что для данного объекта у меня есть несколько "состояний".
- Объект, как он прибывает в начальной операции POST.
- Объект, который я храню в нашей БД
- Объект, который я возвращаю по GET
- Объект, который я ожидаю в патче
например
class MyObject {
// Unwanted on POST
// Required on PATCH
// Included on GET
@JsonProperty("id")
private UUID id;
// Everywhere
@NonNull
@JsonProperty("name")
private String name;
// Field I need for internal processing but don't want included in REST.
private AuditTrail stuff;
@JsonCreator
@Builder
public MyObject(...) { ... }
}
...
@Get
public ResponseEntity myFunction(HttpServletRequest request,
@RequestBody @Valid MyObject requestBody) {
...
}
Проблема, с которой я сталкиваюсь, заключается в том, что на POST, когда идентификатор не указан, десериализация завершается неудачно.Я обошел это с помощью @JsonIgnoreProperties (), но теперь в PATCH, где мне нужен идентификатор, все работает, если оно опущено.
Другой альтернативой, с которой мы играли, было наличие двух объектов.Первое с общими полями для POST, а другое расширяет его от остальных, но оно выглядит грязным, особенно когда мы имеем дело с объектами, более сложными, чем простой пример.
На самом деле это не проблема, так как яВ любом случае, проверяйте и дезинфицируйте входные данные, но мне было интересно, есть ли в Джексоне чистый способ решить эту проблему.