如何使RequestParam动态?

时间:2019-02-19 21:01:15

标签: java spring spring-restcontroller

我有一个POST请求的列表,其中请求正文非常相似

{
  "entity":{
             "type":"Nissan"
             "parts":{
                     "Nissan_unique_content1":"value",
                     "Nissan_unique_content2":"value"
                   }
           }
  "updateDate":"Date..."
}
{
  "entity":{
             "type":"Ford"
             "parts":{
                     "Ford_unique_content1":"value",
                     "Ford_unique_content2":"value",
                     "Ford_unique_content3":"value"
                   }
           }
  "updateDate":"Date..."
}

我有一个通用的RequestBody

public class RequestBody<T>{
  EntityBody<T> entity;
  Date updateDate;
}

public class EntityBody<T>{
  String type;
  T parts;
}

在我的帖子Controller中,我有方法

@RequestMapping(value = "/{type}")
public ResponseEntity<?> create(
            @PathVariable(value = "type") String type,
            @RequestBody RequestBody<T> body) {
...
}

总而言之,是否可以根据类型分配通用类型T? 在这种情况下,我不需要创建多个创建方法,否则我需要创建多个方法,例如

@RequestMapping(value = "/nissan")
public ResponseEntity<?> createNissan(
            @RequestBody RequestBody<NissanContent> body) {
...
}

@RequestMapping(value = "/ford")
public ResponseEntity<?> createFord(
            @RequestBody RequestBody<Ford> body) {
...
}

这是不必要的重复。

2 个答案:

答案 0 :(得分:0)

这可以通过使用-f注释来完成。

例如:

根据“ parts”键下的不同结构定义实体:

@JsonTypeInfo

class NissanParams { @JsonProperty("Nissan_unique_content1") private String nissanUniqueContent1; @JsonProperty("Nissan_unique_content2") private String nissanUniqueContent2; // getters + setters } 中,删除EntityBody字段并添加注释:

type

将有一个单一的控制器方法:

public class EntityBody<T> {

  @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
  @JsonSubTypes({ @JsonSubTypes.Type(value = NissanParams.class, name = "Nissan")})
  private T parts;

}

答案 1 :(得分:0)

您可以使用JsonTypeInfoJsonSubTypes Jackson批注。您的模型可能如下所示:

class EntityBody {

    private Car parts;

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", include = JsonTypeInfo.As.EXTERNAL_PROPERTY)
    @JsonSubTypes({
            @JsonSubTypes.Type(name = "Ford", value = Ford.class),
            @JsonSubTypes.Type(name = "Nissan", value = Nissan.class)
    })
    public Car getParts() {
        return parts;
    }
}

如您所见,您不需要type属性。 Jackson将读取它以查找汽车类型。我已经创建了Car基类/接口,但是您不需要这样做。

您的POST方法可能如下所示:

@RequestMapping(value = "/cars", method = RequestMethod.POST)
public ResponseEntity<?> create(@RequestBody RequestPayload body) {
    logger.info(body.toString());

    return ResponseEntity.ok("OK");
}

您在这里不需要PathVariable