程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

WebFlux body serialization to runtime-dependent model?

发布于2022-09-30 20:14     阅读(577)     评论(0)     点赞(18)     收藏(2)


When there is a ClientResponse from WebClient, in the simplest case we use clientResponse.bodyToMono(MyResponseModel.class) to serialize the response body.

But it is not clear what is the way to go when responses' format can differ depending on situation.

For instance, when response could be one of the two types

type 1: {"a": <number>, "b": <string>}
type 2: {"c": <date>, "d": {"items": <array>}}

I suppose the basic algorithm should be like this

  1. try to serialize to type 1
  2. if OK return model of type 1
  3. else try to serialize to type 2
  4. if OK return model of type 2
  5. else error of serialization

What is the proper way to handle this serialization scenario with Spring WebFlux?


解决方案


You can deserialize the JSON response yourself. First get the response as json String and then do the deserialization yourself with the provided and configured Jackson ObjectMapper and if there is a JsonMappingException try it with model 2. This might not be as efficient as spring does it internally with Jackson2JsonDecoder as it processes the InputStream directly without creating a copy but this seems to be the only way to do it with the try/catch approach currently.

@RestController
class Controller {

    private ObjectMapper objectMapper;

    public Controller(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @GetMapping("/handler")
    public Mono<Object> getHandler() {
        return WebClient
            .create("https://baseurl.com")
            .get()
            .uri("/someUri")
            .retrieve()
            .bodyToMono(String.class)
            .flatMap(json ->
                Mono.<Object>fromCallable(() -> objectMapper.readValue(json, Model1.class))
                .onErrorResume(JsonMappingException.class, e ->
                        Mono.fromCallable(() -> objectMapper.readValue(json, Model2.class))
                )
            );
    }
}

Another solution would be to create a base class or interface for the response types and then implement a custom Jackson JsonDeserializer for it. This could detect which of the types should be used and then perform deserialization.



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/526542/f90dd0da819eb806dbe8/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

18 0
收藏该文
已收藏

评论内容:(最多支持255个字符)