java - Spring Boot 如何自定义反序列化
问题描述
关于这个主题有很多主题,但似乎对我正在尝试做的事情没有帮助。我有 JSON API Spec'ed String 有效负载进入Controllers
,但我想拦截传入的有效负载并以自定义方式反序列化它。
所以代码来解释:
@PostMapping("/steaks")
public ResponseEntity<String> create(@RequestBody String payload) {
// JsonTransformService is a custom service which converts the JSON API Spec string into a Steak POJO
final Steak steak = jsonTransformService.read(Steak.class, payload);
// [...] logic to do with a Steak
}
我想要的是
@PostMapping("/steaks")
public ResponseEntity<String> create(@RequestBody Steak steak) {
// [...] logic to do with a Steak
}
但是目前我不能这样做,因为有效负载不是反序列化的直接匹配项。
因此,我尝试扩展MappingJackson2HttpMessageConverter
和覆盖该read
方法,但这不起作用,因为消耗inputMessage
关闭了流。
处理这个问题的正确方法是什么?
编辑
尝试按照建议使用转换器,但它被忽略Controller
@Slf4j
@Component
public class SteakConverter implements Converter<String, Steak> {
private final JsonTransformService jsonTransformService;
public SteakConverter(JsonTransformService jsonTransformService) {
this.jsonTransformService = jsonTransformService;
}
@Override
public Steak convert(String value) throws IOException {
log.info("converting {}", value);
return jsonTransformService.read(Steak.class, value);
}
}
并调整了Controller
public ResponseEntity<String> create(@RequestBody Steak steak) {}
解决方案
推荐阅读
- python - 使用 iloc 进行索引
- ibm-cloud - IBM Cloud Code Engine:无法重用已删除项目的名称
- visual-studio-code - VS Code 双“放大”错误
- c# - 如何添加连续 ping 来监控显示的 IP 地址?
- css - TailwindCss:本地字体未显示(在 Vue 3 中)
- c++ - 如何打破 XML 类的 Qt 依赖关系
- python - 情节预测的索引和日期问题
- android - Android 折叠工具栏内容重叠
- php - 用codeigniter 3中的路线翻译网站的正确方法?
- flutter - 如何在下拉按钮中绑定 API 数据并获取选定的值?