【发布时间】:2020-03-16 18:46:38
【问题描述】:
这是使用 JsonType 和 JsonSubTypes 注释的基类,需要强制“类型”字段。
@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;
}
}
下面的类包装了上面的类并在控制器中使用。这个包装类已经采用了“类型”,需要将其传递给上面的 Base 类
@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)
{
...
}
在 Spring Boot 中与控制器验证一起使用的 JSON 示例 -
{
"type":"A",
"base": {
"type:"A",
//fields of A
}
}
如何从基础本身内部删除重复类型,如下所示。这给了杰克逊的InvalidIdException。
{
"type":"A",
"base": {
//fields of A
}
}
我知道使用自定义反序列化器是一种方法,但 JsonTypeInfo、JsonSubTypeInfo 和默认完成的所有验证均不适用,所有内容都必须手工制作。
是否可以修复两次所需的类型,以便仅将外部 Json 类型传播到内部并且 Jackson 理解它?
【问题讨论】:
标签: java spring spring-boot jackson