在使用springboot配置了统一异常处理,也可以捕获到异常信息,但是就是返回的数据还是老样子
关键错误信息:
Failed to invoke @ExceptionHandler method: public
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
最后发现原来是我引入fastjson没有配置HttpMessageConverters
引起的
配置一下就可以了
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
// 1. 需要定义一个Convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
// 2.添加fastjson的配置信息,比如是否要格式化返回的json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setDateFormat(Consts.DATE_FORMAT);
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.MapSortField,
// 循环引用
SerializerFeature.DisableCircularReferenceDetect);
// 3.在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConverter;
return new HttpMessageConverters(converter);
}
配置后的错误信息
这个问题修复后又出现了一个新问题:项目中使用ResponseEntity返回流的接口都会报错
org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: write javaBean error, fastjson version 1.2.49, class org.springframework.core.io.InputStreamResource
这是fastjson的一个bug,参考https://github.com/alibaba/fastjson/issues/1701
最后我把HttpMessageConverters
改为MappingJackson2HttpMessageConverter
两个问题都解决
@Bean
@Primary
public HttpMessageConverters jacksonHttpMessageConverters() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(getSupportedMediaTypes());
converter.setDefaultCharset(Charset.forName("UTF-8"));
return new HttpMessageConverters(converter);
}
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullListAsEmpty,
// 循环引用
SerializerFeature.DisableCircularReferenceDetect);
converter.setFastJsonConfig(fastJsonConfig);
converter.setSupportedMediaTypes(getSupportedMediaTypes());
return new HttpMessageConverters(converter);
}
private List<MediaType> getSupportedMediaTypes() {
List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.ALL);
// mediaTypes.add(MediaType.APPLICATION_ATOM_XML);
// mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
// mediaTypes.add(MediaType.APPLICATION_JSON);
// mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
// mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
// mediaTypes.add(MediaType.APPLICATION_PDF);
// mediaTypes.add(MediaType.APPLICATION_RSS_XML);
// mediaTypes.add(MediaType.APPLICATION_XHTML_XML);
// mediaTypes.add(MediaType.APPLICATION_XML);
// mediaTypes.add(MediaType.IMAGE_GIF);
// mediaTypes.add(MediaType.IMAGE_JPEG);
// mediaTypes.add(MediaType.IMAGE_PNG);
// mediaTypes.add(MediaType.MULTIPART_FORM_DATA);
// mediaTypes.add(MediaType.TEXT_EVENT_STREAM);
// mediaTypes.add(MediaType.TEXT_HTML);
// mediaTypes.add(MediaType.TEXT_MARKDOWN);
// mediaTypes.add(MediaType.TEXT_PLAIN);
// mediaTypes.add(MediaType.TEXT_XML);
return mediaTypes;
}