这是用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是JsonType给的。
{
"type":"A",
"base": {
//fields of A
}
}
我知道使用自定义反序列化器是一种方法,但是JsonTypeInfo,JsonSubTypeInfo和默认情况下进行的所有验证均不适用,并且所有操作都必须手工制作。
是否可以将所需的类型固定两次,以便仅将外部Json类型传播到内部,而Jackson可以理解?
问题来源:Stack Overflow
您可以使用, JsonTypeInfo.As.EXTERNAL_PROPERTY
但请注意javadoc
:
包含机制类似于PROPERTY,不同之处在于,在层次结构中将属性包括在更高一级的属性中,即作为同级属性与要键入的JSON对象处于同一级别。请注意,此选择只能用于属性,而不能用于类型(类)。尝试将其用于类将导致基本PROPERTY的包含策略。
因此,这不适用于类级别,但不适用于包装器中的属性
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
public static class BaseWrapper {
@NotBlank
private String type;
@NotNull
@Valid
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type", visible = true)
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = SubA.class, name = "A"),
@JsonSubTypes.Type(value = SubB.class, name = "B")
})
private Base base;
}
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。