SpringBoot中Jackson的使用:注册全局的序列化和反序列化器
2022/7/2 6:20:12
本文主要是介绍SpringBoot中Jackson的使用:注册全局的序列化和反序列化器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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); } }
完毕
这篇关于SpringBoot中Jackson的使用:注册全局的序列化和反序列化器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?