首页 > 解决方案 > 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) {}

标签: javaspringjackson

解决方案


推荐阅读