如何为 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/xml
和 text/plain
响应也正常工作。
对于 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/xml
和 text/plain
响应也正常工作。