springboot使用fastjson中文乱码解决方法 【转载】

以前使用fastjson替换jackson时,没有直接在页面打印过json,都是js使用没有出现乱码,偶然 打印出来出现了中文乱码

一:之前使用的配置方式,该方式只是使FastJsonHTTPMessageConverter优先级更高,并没有替换Jackson

@Configuration
public class FastJsonConf { @Bean
public HttpMessageConverters fastjsonHttpMessageConverter() {
//消息转换对象
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//添加fastjson的配置信息,是否格式化返回json
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//转换器中添加配置信息
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
return new HttpMessageConverters(converter);
}
}

二:找到一个博主的文章解决了乱码:http://www.cnblogs.com/xql4j/p/6729524.html

该种方式完全替换了Jackson

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter { /**
* 利用fastjson替换掉jackson,且解决中文乱码问题
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
fastConverter.setFastJsonConfig(fastJsonConfig);
converters.add(fastConverter);
}
}

在Springboot 2.0.x以上,使用的是spring5.x版本,该版本移除了WebMvcConfigurerAdapter类,所以上面第二种方式不再使用,如果你的需求是完全替换掉Jackson,应该做新的实现:

常用重写接口:

/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;
/** 添加拦截器 **/
void addInterceptors(InterceptorRegistry registry);
/** 这里配置视图解析器 **/
void configureViewResolvers(ViewResolverRegistry registry);
/** 配置内容裁决的一些选项 **/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 视图跳转控制器 **/
void addViewControllers(ViewControllerRegistry registry);
/** 静态资源处理 **/
void addResourceHandlers(ResourceHandlerRegistry registry);
/** 默认静态资源处理器 **/
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);

方式一:

@Configuration
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer { //WebMvcConfigurer接口空实现 /**
* 完全覆盖Jackson
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
List<MediaType> mediaTypes = Lists.newArrayList();
mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonHttpMessageConverter.setSupportedMediaTypes(mediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
converters.add(converter);
}
}

方式二:

@Configuration
class WebMvcConf extends WebMvcConfigurationSupport {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
List<MediaType> mediaTypes = Lists.newArrayList();
mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonHttpMessageConverter.setSupportedMediaTypes(mediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
converters.add(converter);
}
}

推荐使用第二种。

如果需要返回多类型,请在list中添加converter

messageConverters.add(new ByteArrayHttpMessageConverter());

messageConverters.add(stringHttpMessageConverter);

messageConverters.add(new ResourceHttpMessageConverter());

messageConverters.add(new ResourceRegionHttpMessageConverter());

messageConverters.add(new SourceHttpMessageConverter<>());

messageConverters.add(new AllEncompassingFormHttpMessageConverter());

2019-08-07:

如果由于Ajax导致的OCTET_STREAM请求后台不支持,在后台添加对应配置即可:
如果你是FastJson配置
List<MediaType> medias = Lists.newArrayList();
medias.add(MediaType.APPLICATION_OCTET_STREAM);
如果你使用的是Jackson,在MappingJackson2HttPMessageConverter的构造方法中可以看到仅仅支持APPLICATION_JSON_UTF_8,
参考以下文章解决:https://www.jianshu.com/p/491ee2df3d02。
场景:上传文件并携带实体,使用@RequestPart注解报错OCTET_STREAM not support
public Result<Object> insert2(@RequestPart(value = "signDO") SignDO signDO, @RequestPart("file") MultipartFile file){}
解决方法以上两种。
上一篇:【uWSGI】实战之Django配置经验


下一篇:TCMalloc小记