java - 使用 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 它似乎不起作用。我只在控制器上获得基类的信息。
解决方案
如果你使用 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 正文中传递,然后根据您的需要进行正确的调用。
推荐阅读
- python - 按方法值过滤 - SQL 变量过多错误
- arrays - 使用 JSON 文件,我将如何使用 JQ 列出数组内的两个对象?
- docker - 使用 nvidia gpu 创建 docker-compose 时“不允许使用‘设备’属性”
- python - 将唯一组合放入文本文件并检测现有数据
- vb.net - 枚举错误错误。“在被宣布之前不能被提及”
- javascript - 使用 createWriteStream 节点向 JSON 文件中的数组添加值
- python - 在Python中用相同的数字计算每两行
- react-native - 启动隧道时出错 启动隧道超时
- flutter - var numbers = List.generate(10, (i) => i);
- node.js - res.render 不是函数吗?