自定义 MessageConverter 在 Spring 引导中不工作

Custom MessageConverter not working in Spring Boot

我想在 Spring 引导中注册一个自定义 MessageConverter,以便让我更好地控制消息的转换方式。我有一个 Spring Boot 2.1.7 Webflux 应用程序。

我创建了自定义转换器:

public class CustomConverter extends MappingJackson2HttpMessageConverter {
    ...
}

并将其注册为:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
    return new CustomConverter();
}

我还确认它是通过自动装配注册的 HttpMessageConverters 并确认它在转换器列表中。 然后我实现了一些我期望被调用的方法,如 canReadcanWritereadInternalwriteInternal 并在它们上放置断点。 我的应用程序公开了一个以 JSON 响应的 Rest 端点,还调用了一个外部 Rest 服务,该服务 POST 一个 JSON 有效负载并在 return 中接收 JSON。

我在任何时候都看不到我的转换器正在被使用。我什至删除了所有其他转换器,只留下我自己的转换器,但它仍然没有被调用。

我错过了什么吗?

如果您要转换的是 Controller 参数,请使用 @RequestBody 注释来指示 HTTP 请求的 body 被反序列化为特定的 Java 实体。

为了确定合适的转换器,Spring 将使用来自客户端请求的“Content-Type”和"Accept" header。

所以下面的请求将由 JSON 转换器处理(而不是 xml 转换器),因为 "Accept: application/json"

curl --header "Accept: application/json"
  http://localhost:8080/spring-boot-rest/foos/1

"Accept" 指定响应可接受的特定媒体类型。 "Content-Type"表示发送到服务器的entity-body的媒体类型。

更多案例见here

在我的 WebFlux 应用程序中,我必须执行以下操作才能使其正常工作:

@Bean
public WebFluxConfigurer webFluxConfigurer(){

    return new WebFluxConfigurer() {
        @Override
        public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
            configurer.registerDefaults(false);
            configurer.customCodecs().encoder(new CustomEncoder());
            configurer.customCodecs().decoder(new CustomDecoder());
        }
    };

}