Spring @RequestBody继承

时间:2018-02-11 15:19:10

标签: java json spring inheritance jackson

我已经阅读了几篇试图解释这个问题的帖子,但我无法让它发挥作用。我有一个场景,我的服务输入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,其值为OWNERCLIENT

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 错误。

问题是:

  1. 如何修复此问题,并使@RequestBody继承有效?
  2. 有没有办法在子类型上指定注释,而不是在超类型上定义所有注释?

1 个答案:

答案 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 {
 .....
}
  1. 您说ProfileType枚举有 OWNER CLIENT 。但是您已在JsonSubTypes.Type中指定为客户和所有者。因此不匹配
  2. JsonTypeInfo.Id.CLASS更改为JsonTypeInfo.Id.NAME