Вот базовый класс, аннотированный JsonType и JsonSubTypes с обязательным обязательным полем «type».
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true)
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = SubA.class, name = "A"),
@JsonSubTypes.Type(value = SubB.class, name = "B")
})
public abstract class Base {
private String type;
public String getType()
{
return type;
}
public void setType(String type)
{
this.type = type;
}
}
Ниже приведен класс, который переносится над классом и используется в контроллере. Этот класс-оболочка уже принимает «тип», который нужно передать классу выше
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
class BaseWrapper {
@NotBlank
private String type;
@NotNull
@Valid
private Base base;
}
Наконец, проверка здесь в контроллере
@PostMapping("/createBase")
public ResponseEntity<ResponseDto> createBase(@RequestBody @Valid BaseWrapper)
{
...
}
Образец JSON, который работает с проверки контроллера при весенней загрузке -
{
"type":"A",
"base": {
"type:"A",
//fields of A
}
}
Как можно удалить дубликат типа из внутренней базы, как показано ниже. это дает InvalidIdException
от Джексона.
{
"type":"A",
"base": {
//fields of A
}
}
Я понимаю, что использование Custom Deserializer - это один из способов, но тогда JsonTypeInfo, JsonSubTypeInfo и все проверки, выполняемые по умолчанию, не применяются, и все должно быть создано вручную.
Можно ли установить требуемый тип дважды так, чтобы только внутренний тип Json распространялся на внутренний, и Джексон это понимал?