Spring MVC自定义消息转换器(可解决Long类型数据传入前端精度丢失的问题)

方法一 jackson注解

<dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-annotations</artifactId>
     <version>2.8.6</version>
 </dependency>
 <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.8.6</version>
 </dependency>
package com.paascloud.helper;


import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
 * Long 类型字段序列化时转为字符串,避免js丢失精度
 */
public class LongJsonSerializer extends JsonSerializer<Long> {
    /**
     * Serialize.
     *
     * @param value              the value
     * @param jsonGenerator      the json generator
     * @param serializerProvider the serializer provider
     *
     * @throws IOException the io exception
     */
    @Override
    public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String text = (value == null ? null : String.valueOf(value));
        if (text != null) {
            jsonGenerator.writeString(text);
        }
    }
}
package com.paascloud.helper;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

/**
 * 将字符串转为Long
 */
public class LongJsonDeserializer extends JsonDeserializer<Long> {
    private static final Logger logger = LoggerFactory.getLogger(LongJsonDeserializer.class);

    /**
     * Deserialize long.
     *
     * @param jsonParser             the json parser
     * @param deserializationContext the deserialization context
     *
     * @return the long
     *
     */
    @Override
    public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) {
        String value = null;
        try {
            value = jsonParser.getText();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            return value == null ? null : Long.parseLong(value);
        } catch (NumberFormatException e) {
            logger.error("解析长整形错误", e);
            return null;
        }
    }
}
@Data
public class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonSerialize(using = LongJsonSerializer.class)
    @JsonDeserialize(using = LongJsonDeserializer.class)
    private Long id;
}

发现在List中还有问题

方法二

<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client -->
 <dependency>
     <groupId>org.apache.rocketmq</groupId>
     <artifactId>rocketmq-client</artifactId>
     <version>4.1.0-incubating</version>
 </dependency>
 <dependency>
     <groupId>de.codecentric</groupId>
     <artifactId>spring-boot-admin-starter-client</artifactId>
 </dependency>
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-freemarker</artifactId>
 </dependency>
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-feign</artifactId>
 </dependency>
@Bean
    public ObjectMapper ObjectMapper(){
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        ObjectMapper objectMapper = new ObjectMapper()
                .registerModule(new ParameterNamesModule())
                .registerModule(new Jdk8Module())
                .registerModule(new JavaTimeModule())
                .registerModule(simpleModule);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//      SerializerProvider serializerProvider = objectMapper.getSerializerProvider();
//      serializerProvider.setNullValueSerializer(new JsonSerializer<Object>() {
//          @Override
//          public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
//              jsonGenerator.writeString("");
//          }
//
//      });
        return objectMapper;
    }

小坑一个记录一下, 解决现有问题

上一篇:python os.listdir按文件存取时间顺序列出目录


下一篇:WPF自定义控件与样式(13)-自定义窗体Window & 自适应内容大小消息框MessageBox