我已经阅读了几篇试图解释这个问题的帖子,但我无法让它发挥作用。我有一个场景,我的服务输入JSON
可以是几种子类型。基本上,我有一个基类UserDto
,然后是ClientDto
和OwnerDto
这两个都从UserDto.
延伸到了我希望实现控制器能够解决的问题UserDto
的具体子类型到正确类的对象中。就像这样。
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public void doSomething(@RequestBody UserDto user) {
ClientDto client = (ClientDto) user;
// do something
}
我试过这样的事情。基本上我想根据字段profileType
来确定具体对象的类型,该字段的类型为枚举ProfileType
,其值为OWNER
和CLIENT
。
UserDto.java
@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY, property = "profileType", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = ClientDto.class, name = "Client"),
@JsonSubTypes.Type(value = OwnerDto.class, name = "Owner")
})
public class UserDTO {
@NotNull
@Size(min = 0, max = 256)
private ProfileType profileType;
@NotNull
@Size(min = 0, max = 512)
private String email;
// ...
}
ClientDto.java
public class ClientDto extends UserDto {
private Integer salary;
private Integer efficiency;
// ...
}
我尝试将以下JSON发布到此终点。
{
"email": "eddie.barra22@gmail.com",
"profileType": "CLIENT",
"salary": "100",
"efficiency": "99"
}
我希望将其解析为ClientDto
类型。相反,我只有一个 400 Bad Request 错误。
问题是:
@RequestBody
继承有效?答案 0 :(得分:1)
代码中的一些错误。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "profileType", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = ClientDto.class, name = "CLIENT"),
@JsonSubTypes.Type(value = OwnerDto.class, name = "OWNER")
})
public class UserDTO {
.....
}
JsonSubTypes.Type
中指定为客户和所有者。因此不匹配JsonTypeInfo.Id.CLASS
更改为JsonTypeInfo.Id.NAME