美文网首页
web层返回值Long数据值太大丢失精度咋办

web层返回值Long数据值太大丢失精度咋办

作者: 酷酷的美猴王 | 来源:发表于2021-03-23 17:28 被阅读0次

    跟前端联调时,发现一个问题,返回给前端的字段id long型 后端postman 得到的是9433916916430849,但前端取到的是9433916916430848
    这就很诡异!为啥前端得到的值会自动减一!

    具体为啥会减一也没有搞清楚,但找到了解决办法~

    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.module.SimpleModule;
    
    
    @Configuration
    public class WebConfig  extends WebMvcConfigurerAdapter {
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            SimpleModule simpleModule = new SimpleModule();
            simpleModule.addSerializer(Long.TYPE, LongToStringSerializer.INSTANCE);
            simpleModule.addSerializer(Long.class, LongToStringSerializer.INSTANCE);
    
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.registerModule(simpleModule);
            // JSON里面包含了实体没有的字段导致反序列化失败
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
    
            converters.clear();
            converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
            super.configureMessageConverters(converters);
        }
    }
    
    import java.io.IOException;
    
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
    import com.fasterxml.jackson.databind.ser.std.StdSerializer;
    
    @JacksonStdImpl
    public class LongToStringSerializer extends StdSerializer<Long> {
    
        public static final LongToStringSerializer INSTANCE = new LongToStringSerializer();
    
        public static final int MIN_CONVER_LENGTH = 14;
    
        public LongToStringSerializer() {
            super(Long.class);
        }
    
        @Override
        public boolean isEmpty(SerializerProvider provider, Long value) {
            if (value == null) {
                return true;
            }
            return false;
        }
    
        @Override
        public void serialize(Long aLong, JsonGenerator jsonGenerator,
                SerializerProvider serializerProvider) throws IOException {
            int length = aLong.toString().length();
            if (length > MIN_CONVER_LENGTH) {
                jsonGenerator.writeString(aLong.toString());
            } else {
                jsonGenerator.writeNumber(aLong);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:web层返回值Long数据值太大丢失精度咋办

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