如何为 JSON 和纯文本正确配置 jackson 转换器

How to properly configure jackson converters for JSON and plain text

对于 Spring MVC(不是 Spring 引导),我不得不更改扩展 WebMvcConfigurationSupport 的配置 class 以实现 WebMvcConfigurer 和添加 @EnableWebMvc 注释。这会导致多个端点的响应转换出现问题。该项目默认为 application/json 并且它用于大多数响应,但是,有几个端点 return application/xml 甚至一些端点 return text/plain . JSON 使用以下 Java 配置修改响应以删除包含 null 的字段:

@Bean
public MappingJackson2HttpMessageConverter jsonConverter() {
  List<MediaType> supportedMediaTypes = new ArrayList<>();
  supportedMediaTypes.add(MediaType.APPLICATION_JSON);

  Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
  builder.serializationInclusion(JsonInclude.Include.NON_NULL);
  builder.timeZone(TimeZone.getTimeZone(timeZone));

  MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(
    builder.build()
  );
  jsonConverter.setSupportedMediaTypes(supportedMediaTypes);
  return jsonConverter;
}

这会导致 JSON 响应被正确 return 编辑,但会导致 text/plain 端点出现异常。然后他们产生一个错误:

No converter for [class java.lang.String] with preset Content-Type 'null'

可以通过在JSON转换器之前添加默认字符串转换器来解决错误:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  converters.add(new StringHttpMessageConverter());
  converters.add(jsonConverter());
}

但是,这会导致 return JSON 但在 Java 中仅具有 String 作为 return 类型的端点的问题。双引号之间的字符串应该是 returned:"response",但它们只 return 不带引号的字符串:response。这使得大多数客户端无法将响应识别为有效 JSON。奇怪的是,POJO 仍然转换为有效的 JSON.

如何使用实现 WebMvcConfigurer 并用 @EnableWebMvc 注释的配置 class 配置我的 Spring MVC(不是 Spring 引导)项目到 return JSON 没有 null 字段和单个字符串作为有效 JSON (例如,带双引号:"response")但也是纯文本?

我的建议是再添加一个用于处理字符串响应的 bean,就像您为 json 添加的一样,并将转换器添加到 converters.add(stringConverter());

已找到一个合适的解决方案,它具有 REST API return 有效 JSON 响应,即使对于 return 字符串的方法(因此在returned 字符串),同时还能够 return XML 和纯文本响应。 在配置 class 中 implements WebMvcConfigurer 并用 @EnableWebMvc 注释,我们通过覆盖 extendMessageConverters 注册默认转换器。默认 MappingJackson2HttpMessageConverter 从列表中删除,我们的自定义 JSON 转换器被添加为列表中的第一个转换器。通过在 StringHttpMessageConverter 方法之前添加 JSON 转换器,return 字符串将其响应转换为有效的 JSON(带双引号),而 application/xmltext/plain 响应也正常工作。