Spring @RequestBody继承

9

我读了几篇文章,试图解释这个问题,但是我无法使它工作。我有一个场景,我的服务的输入 JSON 可能是几个子类型中的任何一种。基本上,我有一个基类 UserDto ,然后 ClientDtoOwnerDto 都是从 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,其值为OWNERCLIENTUserDto.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错误。

我的问题是:

  1. 我该如何修复这个问题,并使@RequestBody继承正常工作?
  2. 是否有一种方法可以在子类型上指定注释,而不是在父类型上定义所有注释?
1个回答

9
你的代码中有几个错误。
@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 {
 .....
}
  1. 您说ProfileType枚举有OWNERCLIENT。但是在JsonSubTypes.Type中,您指定为Client和Owner,因此不匹配。
  2. JsonTypeInfo.Id.CLASS更改为JsonTypeInfo.Id.NAME

谢谢,这很有效。在子类级别上注释这样的行为是否可能? - wesleyy
是的,但对于任何新的子类型,您需要记得更新父级。 - wesleyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接