我读了几篇文章,试图解释这个问题,但是我无法使它工作。我有一个场景,我的服务的输入 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
继承正常工作? - 是否有一种方法可以在子类型上指定注释,而不是在父类型上定义所有注释?