首页 > 解决方案 > 使用 Jackson 库动态处理请求参数

问题描述

我有一个休息控制器,它有一个 GET 请求,请求参数可以是任何我想说的更动态的类型。我想根据我们从用户那里获得的数据将请求参数映射到适当的子类。BaseRequest 类是 `

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = RequestA.class, name = "RequestA"),
        @JsonSubTypes.Type(value = RequestB.class, name = "RequestB")
})
@Data
@NoArgsConstructor
public class BaseRequest {
    private String error;
}

RequestA class is

@Data
@JsonTypeName("RequestA")
@NoArgsConstructor
public class RequestA extends BaseRequest {
    private String token;
}

`

请求B是`

@Data
@JsonTypeName("RequestB")
@NoArgsConstructor
public class RequestB extends BaseRequest {
    private String id;
}

`

我的控制器是`

@GetMapping(value = "/request", produces = MediaType.APPLICATION_JSON_VALUE)
    public String request(BaseRequest request)

`

请求看起来像 1)http://localhost:8080/request?token=abc&error=test 2)http://localhost:8080/request?id=abc 它似乎不起作用。我只在控制器上获得基类的信息。

标签: javaspringspring-bootjackson

解决方案


如果你使用 GET 它不会使用 JSON,你可以写

@GetMapping(value = "/request", produces = MediaType.APPLICATION_JSON_VALUE)
 public String request(@RequestParam(required = false) String token,
 @RequestParam(required = false) String id, @RequestParam(required = false) String error) {
  //Initialize request A if token is not null else request B or add your custom control
}

如果您需要更多具有不同目的的参数,您可以创建一个自定义对象以在 POST 正文中传递,然后根据您的需要进行正确的调用。


推荐阅读