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

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

注:此种方式会引发Hibernate事务同步问题,虽然修改的是接口层,但是会影响DAO层,修改建议如下:
https://www.cnblogs.com/zolmk/p/16452157.html
什么情况下会用到?
当我们需要对在接口中,对接收参数做一些复杂格式校验的时候。例如有个需求,需要对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); } }

完毕
注意:这里的WebMvcConfigurationSupport建议改为WebMvcConfigurer,因为WebMvcConfigurationSupport会导致自动配置失效,具体见WebMvcAutoConfiguration类的注解。


__EOF__

本文作者ZOLMK
本文链接https://www.cnblogs.com/zolmk/p/16436338.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zolmk  阅读(1533)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示