问题:springboot接口接收Long或Integer这种整数型字段,如果传小数不报错,会只保留整数部分。
解决方案:springboot默认采用jackson进行序列化与反序列化,添加jackson对整数类型的反序列化。
package com.example.demo.config;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.time.format.DateTimeFormatter;
@Configuration
public class JacksonConfiguration {
    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String formatValue;
    @Bean(name = "format")
    public DateTimeFormatter format() {
        return DateTimeFormatter.ofPattern(formatValue);
    }
    @Bean
    public ObjectMapper serializingObjectMapper(@Qualifier("format") DateTimeFormatter format) {
        ObjectMapper mapper = new ObjectMapper()
                .registerModule(new ParameterNamesModule())
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .disable(MapperFeature.DEFAULT_VIEW_INCLUSION)
                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                .registerModule(serializerAndDeserializerModule());
        return mapper;
    }
    /**
     * 序列化与反序列化
     * @return SimpleModule
     */
    public SimpleModule serializerAndDeserializerModule(){
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Long.class, LongJsonDeserializer.instance);
        module.addDeserializer(Long.TYPE, LongJsonDeserializer.instance);
        module.addDeserializer(Integer.class, IntegerJsonDeserializer.instance);
        module.addDeserializer(Integer.TYPE, IntegerJsonDeserializer.instance);
        return module;
    }
    public static class LongJsonDeserializer extends JsonDeserializer<Long> {
        public static final LongJsonDeserializer instance = new LongJsonDeserializer();
        @Override
        public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
            String value = jsonParser.getText();
            try {
                return value == null ? null : Long.parseLong(value);
            } catch (NumberFormatException e) {
                throw e;
            }
        }
    }
    public static class IntegerJsonDeserializer extends JsonDeserializer<Integer> {
        public static final IntegerJsonDeserializer instance = new IntegerJsonDeserializer();
        @Override
        public Integer deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
            String value = jsonParser.getText();
            try {
                return value == null ? null : Integer.parseInt(value);
            } catch (NumberFormatException e) {
                throw e;
            }
        }
    }
}