使用 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 并指定您想要的命名策略类型。
好的,所以这不是清理后的解决方案,我将使用我们库中的这个解决方案,但我的工作的基本要点如下所示:
@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)
的响应中。
效果很好,我很满意。
我的微服务需要通过 HTTP 与 2 个不同的服务通信。 1 与 snake_case JSON 有一个 API 合同,而另一个使用驼峰命名法。我如何配置 WebFlux 以在一组功能端点上使用某个 Jackson ObjectMapper
反序列化和序列化 JSON,同时在不同的端点上使用另一个?
WebFlux 文档 shows 如何连接另一个 ObjectMapper,但这适用于我 API 的所有端点。所以现在我所有的 JSON 都是 snake_case 或驼峰式。找不到任何资源来解决这个问题,但它一定是可行的吧?
更新:为了明确起见,我想配置从其他服务接收请求的网络服务器,而不是自己发送 http 请求的网络客户端。我知道怎么做后者。
您可以在 类 上使用 @JsonNaming
注释 serialize/deserialize 并指定您想要的命名策略类型。
好的,所以这不是清理后的解决方案,我将使用我们库中的这个解决方案,但我的工作的基本要点如下所示:
@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)
的响应中。
效果很好,我很满意。