使用 Spring WebFlux 在不同端点上的不同 JSON(反)序列化配置

Different JSON (de)serialization configs on different endpoints using Spring WebFlux

我的微服务需要通过 HTTP 与 2 个不同的服务通信。 1 与 snake_case JSON 有一个 API 合同,而另一个使用驼峰命名法。我如何配置 WebFlux 以在一组功能端点上使用某个 Jackson ObjectMapper 反序列化和序列化 JSON,同时在不同的端点上使用另一个?

WebFlux 文档 shows 如何连接另一个 ObjectMapper,但这适用于我 API 的所有端点。所以现在我所有的 JSON 都是 snake_case 或驼峰式。找不到任何资源来解决这个问题,但它一定是可行的吧?

更新:为了明确起见,我想配置从其他服务接收请求的网络服务器,而不是自己发送 http 请求的网络客户端。我知道怎么做后者。

您可以在 类 上使用 @JsonNaming 注释 serialize/deserialize 并指定您想要的命名策略类型。

jackson-advanced-annotations

好的,所以这不是清理后的解决方案,我将使用我们库中的这个解决方案,但我的工作的基本要点如下所示:

@Controller
public class Handler {

    private ObjectMapper mapper;

    public Handler(@Qualifier("snakeCaseWrapper") ObjectMapper mapper) {
        this.mapper = mapper;
    }

    Mono<ServerResponse> returnUser(final ServerRequest request) {
        //REQUEST DESERIALIZATION
        var messageReader = new DecoderHttpMessageReader<>(new Jackson2JsonDecoder(mapper));
        var configuredRequest = ServerRequest.create(request.exchange(), List.of(messageReader));

        //RESPONSE SERIALIZATION
        return configuredRequest.bodyToMono(UserDto.class)
                                .map(userDto -> {
                                    try {
                                        return mapper.writeValueAsString(userDto);
                                    } catch (JsonProcessingException e) {
                                        e.printStackTrace();
                                        //properly handle the error here
                                        return "";
                                    }
                                })
                                .flatMap(json -> ServerResponse.ok()
                                                               .contentType(MediaType.APPLICATION_JSON)
                                                               .body(BodyInserters.fromObject(json))
                                );
    }
}

这是我能找到的以编程方式选择哪种 ObjectMapper 我想用于请求反序列化的特定 endpoint/handler 方法的唯一方法。对于响应序列化,技巧是首先使用 ObjectMapper 将响应主体序列化为 String,然后将 String 放入带有 BodyInserters.fromObject(json) 的响应中。

效果很好,我很满意。