当前位置: 首页 > 知识库问答 >
问题:

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

景哲
2023-03-14

我的微服务需要通过HTTP与2个不同的服务进行通信。1个与snake_caseJSON有API契约,而另一个使用camelCase。如何配置WebFlux在一组功能endpoint上使用某个JacksonObjectMapper反序列化和序列化JSON,而在不同endpoint上使用另一个?

WebFlux文档展示了如何连接另一个ObjectMapper,但这适用于我的API的所有endpoint。所以现在要么我所有的JSON都在snake_case中,要么在camelCase中。找不到任何资源来解决这个问题,但它必须是可行的,对吗?

更新:为了清楚起见,我想配置接收来自其他服务的请求的Web服务器,而不是用于自己发送http请求的web客户端。我知道该怎么做后者。

共有2个答案

苍志文
2023-03-14

好的,所以这不是清理后的解决方案,我将使用我们图书馆中的这个解决方案,但是我工作的基本要点是这样的:

@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将响应主体序列化为String,然后将该String放入带有BodyInserters.fromObject(json)的响应中。

它有效,所以我很高兴。

邴墨竹
2023-03-14

您可以在想要序列化/反序列化的类上使用< code>@JsonNaming注释,并指定想要的命名策略类型。

杰克逊高级注释

 类似资料:
  • 问题内容: 我正在尝试使用Gson 反序列化a ,值的类型可以变化,值“ in_wanted”可以是a 或a 。 in_wanted为: in_wanted为: 每当“ in_wanted”的值为布尔值时,我都需要该对象,并且需要一个反序列化器以返回null。用Gson做到这一点的最佳方法是什么? 问题答案: 您可以使用自定义解串器来完成此操作。首先,我们应该创建可以表示您的JSON的数据模型。

  • 我有一个这样的JSON: 所有类型都可以包含可变时间,或者只能有一种类型只有一次。 在SpringBoot应用程序中,我有三个类,扩展了公共类。 我有两种方法来序列化和反序列化它。 虽然测试序列化是可以的,但是反序列化在默认情况下不起作用。所以我修改了<code>CommonObject</code>如下: 现在,反序列化工作正常,但序列化不行。json值中包含属性< code>type两次。 有

  • 问题内容: 是否可能:在类中有一个字段,而在Jackson库中进行序列化/反序列化时却为其使用不同的名称? 例如,我有“ Coordiantes”类。 对于从JSON反序列化,希望具有以下格式: 但是当我序列化对象时,结果应该是这样的: 我试图通过在getter和setter上都应用注释(具有不同的值)来实现此目的: 但我有一个例外: org.codehaus.jackson.map.exc.Un

  • 我的Spring Boot API使用camelCase,但我需要通过我的API将一些请求代理到使用snake_case的第三方API。是否可以将Jackson配置为从snake_case反序列化第三方响应,然后将其序列化回camelCase到我的前端? 所需功能的逐步示例: 示例对象: 我调用我的API API调用第三方 第三方返回 我的API将其反序列化为 我的API序列化对象并返回 现在我使

  • 序列化和反序列化的方式不同于 我已经创建了两个序列化程序 和 我用Jackson查看了序列化/反序列化映射 ,但找不到解决方案。

  • 我之前的问题没有得到任何结果,可能是我问得不对,或者太详细了。 现在我的基本问题是,如何将一个具有一个类名的JSON对象反序列化为一个具有不同类名的Java对象? 例如,服务器发送/期望的JSON类是“18”(我对此控制为零)。我的Java班不可能是“18”,所以是“_18”。 简单地执行new Gson().fromjson()没有任何帮助,即使使用了不同的命名策略;_18对象始终为NULL。从