zoukankan      html  css  js  c++  java
  • 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){}
    解决方法以上两种。
    

    更多高级用法:https://www.javazhiyin.com/40200.html,详解了fastjson注解,自定义序列化等,包括与集成spring,data redis和版本适配问题。

  • 相关阅读:
    AngularJS定时器任务
    ssh常用
    HTTPClient模块的HttpGet和HttpPost
    eclipse下设置tomcat,修改Java代码不必重启tomcat
    【转】调试Release发布版程序的Crash错误
    C/C++ 函数压栈方式
    PHP 安全三板斧:过滤、验证和转义之转义篇 & Blade模板引擎避免XSS攻击原理探究
    让 MySQL 支持 emoji 存储
    Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程
    常见的Web实时消息交互方式和SignalR
  • 原文地址:https://www.cnblogs.com/mzc1997/p/10260024.html
Copyright © 2011-2022 走看看