ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringBoot中Jackson的使用:注册全局的序列化和反序列化器

2022-07-02 02:00:20  阅读:246  来源: 互联网

标签:Jackson SpringBoot java jackson import 序列化 com public BigDecimal


SpringBoot中Jackson的使用:注册全局的序列化和反序列化器

什么情况下会用到?
当我们需要对在接口中,对接收参数做一些复杂格式校验的时候。例如有个需求,需要对BigDecimal类型的入参做格式校验,并且校验不通过时,返回对应的错误信息。

创建序列化器和反序列化器

BigDecimalSerializer.java

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

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (bigDecimal == null) {
            jsonGenerator.writeString("0.00");
        }else {
            // 保留两位小数
            bigDecimal = bigDecimal.setScale(2, RoundingMode.UP);
            // 不使用科学计数法
            jsonGenerator.writeString(bigDecimal.toPlainString());
        }
    }
}

BigDecimalDeserializer.java

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fy.chars.StringUtils;
import com.fy.exception.BizException;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.function.Predicate;
import java.util.regex.Pattern;

public class BigDecimalDeserializer extends JsonDeserializer<BigDecimal> {
    public static final String PATTERN = "^[0-9]*\\.?[0-9]{0,2}$";
    public static final Predicate<String> PATTERN_BIG_DECIMAL = Pattern.compile(PATTERN).asPredicate();
    @Override
    public BigDecimal deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        String s = jsonParser.readValueAs(String.class);
        if (StringUtils.isBlank(s))  return null;
        if (PATTERN_BIG_DECIMAL.test(s)) {
            return new BigDecimal(s);
        }
        throw new BizException("BigDecimal格式错误");
    }
}

注册到全局

GlobalJacksonConfiguration.java

import com.fasterxml.jackson.databind.module.SimpleModule;
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.WebMvcConfigurationSupport;

import java.math.BigDecimal;
import java.util.List;

@Configuration
public class GlobalJacksonConfiguration extends WebMvcConfigurationSupport {
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        SimpleModule module = new SimpleModule();

        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        
        module.addDeserializer(BigDecimal.class, new BigDecimalDeserializer());
        module.addSerializer(new BigDecimalSerializer());
        
        converter.getObjectMapper().registerModule(module);
        
        converters.add(converter);
        
        super.configureMessageConverters(converters);
    }
}

完毕

标签:Jackson,SpringBoot,java,jackson,import,序列化,com,public,BigDecimal
来源: https://www.cnblogs.com/zolmk/p/16436338.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有