美文网首页
如何修改Spring Boot默认的JSON解析框架

如何修改Spring Boot默认的JSON解析框架

作者: WalterWong | 来源:发表于2018-03-29 18:27 被阅读0次

    起因

      写这篇文章的起因是源于一次前端JavaScript对于Long类型数据处理的精度丢失问题。这个问题导致我在做删除操作的时候始终无法成功

    问题

      很多时候后台会把主键ID的类型设置成Long类型,这样做虽然有很多好处,但是也存在一个问题,如果Long类型的数据过长的话(比如{id:122000083049775104})就会导致前端JavaScript在处理ID的时候丢失精度,它会将id处理成122000083049775100,很明显,原ID貌似被四舍五入了一样。

    方案

      既然前端无法精确处理Long类型数据,那我们可以将Long类型数据转换成String类型后再交给前台。例如我们将FastJSON作为默认JSON工具,根据不同的RESTFUL实现方式的不同可以分为两类,基于Jersey和基于Spring

    一、修改Jersey的默认JSON工具

    例如我们的User对象中的id属性是Long类型,我们只需要指定id字段的序列化方式即可

    @Data
    public class User implements Serializable {
        private static final long serialVersionUID = -6308055729212523806L;
    
        // 将Long类型转换成String,防止前台出现精度丢失的问题
        @JSONField(serializeUsing = ToStringSerializer.class)
        @FormParam("id")
        private Long id;
        /**
         * 姓名
         */
        @FormParam("name")
        private String name;
        /**
         * 昵称
         */
        @FormParam("nickname")
        private String nickname;
        ...
    }
    

      本以为这样就可以大功告成,但是事与愿违,前端得到的id的值还是122000083049775100。问题的原因是因为虽然我们指定了@JSONField(serializeUsing = ToStringSerializer.class),但是这是FastJson的注解,而我们的RESTFUL使用的是Jersey,它默认的JSON框架的jackson,并非FastJSON。有关于JerseyJSON的资料可以点击这里查看
    根据官网的解释,只需要注册FastJson即可。编辑JerseyConfig.java文件

    /**
     * Jersey配置类
     * @author Walter Wong
     */
    @Component
    public class JerseyConfig extends ResourceConfig {
        /**
         * 注册服务,使其识别JAX-RS注解
         */
        public JerseyConfig() {
            register(RequestContextFilter.class);
            //注册跨域过滤器
            register(CorsFilter.class);
            //注册fastJson作为Json序列化工具
            register(FastJsonFeature.class);
            ...
        }
    }
    

    二、修改Spring Boot默认的JSON

    如果使用的SpringREST实现,我们需要在入口类中做如下改变即可

    1. 方案一
      启动类继承WebMvcConfigurerAdapter,覆盖方法configureMessageConverters
    ...
    @SpringBootApplication
    public class UserApplication extends WebMvcConfigurerAdapter{
     
      @Override
      public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
     
        // 初始化转换器
        FastJsonHttpMessageConverter fastConvert = new FastJsonHttpMessageConverter();
        // 初始化一个转换器配置
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        // 将配置设置给转换器并添加到HttpMessageConverter转换器列表中
        fastConvert.setFastJsonConfig(fastJsonConfig);
     
        converters.add(fastConvert);
      }
     
      public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
      }
    }
    
    1. 方案二
      在启动类中注入 HttpMessageConverters
    ...
    @SpringBootApplication
    public class UserApplication {
        /**
         * 配置FastJson为Spring Boot默认JSON解析框架
         * @return  HttpMessageConverters
         */
        @Bean
        public HttpMessageConverters fastJsonHttpMessageConverters() {
            // 1.定义一个converters转换消息的对象
            FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
            // 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json数据
            FastJsonConfig fastJsonConfig = new FastJsonConfig();
            fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
            // 3.在converter中添加配置信息
            fastConverter.setFastJsonConfig(fastJsonConfig);
            // 4.将converter赋值给HttpMessageConverter
            HttpMessageConverter<?> converter = fastConverter;
            // 5.返回HttpMessageConverters对象
            return new HttpMessageConverters(converter);
        }
        public static void main(String[] args) {
            SpringApplication.run(UserApplication.class, args);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:如何修改Spring Boot默认的JSON解析框架

          本文链接:https://www.haomeiwen.com/subject/unqvcftx.html