【问题标题】:Custom MessageConverter not working in Spring Boot自定义 MessageConverter 在 Spring Boot 中不起作用
【发布时间】:2019-12-27 11:17:25
【问题描述】:

我想在 Spring Boot 中注册一个自定义 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 有效负载并接收 JSON 作为回报。

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

我错过了什么吗?

【问题讨论】:

    标签: spring-boot spring-webflux


    【解决方案1】:

    在我的 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());
            }
        };
    
    }
    

    【讨论】:

    • 这对我有用,还有很多其他不正确的解决方案
    【解决方案2】:

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

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

    因此以下请求将由 JSON 转换器(而不是 xml 转换器)处理,因为“Accept: application/json”

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

    “接受”指定响应可接受的某些媒体类型。 “Content-Type”表示发送给服务器的entity-body的媒体类型。

    更多案例见here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-14
      • 2021-12-25
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多