JAVASpring

Springboot 接口接收整数型字段传小数不报错

问题: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;
            }
        }
    }
}