SpringBoot通过自定义注解对BigDecimal输出的小数位数进行格式化
前言
在近期的开发任务中出现如下场景:
1.Java代码中BigDecimal类型的数据设置初始值为0,且数据库中该字段的类型也为BigDecimal,但查询返回给前端时值为0,没有小数位数(业务需要0也要有小数位数)。
2.根据业务场景同为BigDecimal类型的不同字段返回给前端时需要保留不同的小数位数。
因为以上两点所以无法设置全局的BigDecimal格式化类型,通过查询资料发现可以通过自定义注解的方式搭配自定义序列化器实现需求。
一、JsonSerializer
JsonSerializer类:提供将对象或值类型序列化为 JSON 以及将 JSON 反序列化为对象或值类型的功能。
继承JsonSerializer类需要实现serialize()方法,在这个方法中处理要返回的数据。
二、ContextualSerializer
ContextualSerializer:JsonSerializer可以实现的附加接口以获取回调,该回调可用于创建序列化程序的上下文实例以用于处理支持类型的属性。
这对于可以通过注释配置的序列化程序很有用,或者应该根据正在序列化的属性类型而具有不同的行为。
三、实现
代码如下:
1.继承JsonSerializer类,实现ContextualSerializer接口
@JsonComponent
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> implements ContextualSerializer {
//格式化BigDecimal类型的小数位数(默认)
private String format = "#####0.00";
@Override
public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(new DecimalFormat(format).format(bigDecimal));
}
/**
* createContextual可以获得字段的类型以及注解。
* createContextual方法只会在第一次序列化字段时调用(因为字段的上下文信息在运行期不会改变),所以不用担心影响性能。
*
* @param serializerProvider
* @param beanProperty
* @return
* @throws JsonMappingException
*/
@Override
public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
//当前字段不为空
if (beanProperty != null) {
//如果当前字段类型为BigDecimal类型则处理,否则跳过
if (Objects.equals(beanProperty.getType().getRawClass(), BigDecimal.class)) {
//获取当前字段的自定义注解
OMSBigDecimalFormat annotation = beanProperty.getAnnotation(OMSBigDecimalFormat.class);
//没有打自定义注解,获取上下文中的自定义注解
if (annotation == null) {
annotation = beanProperty.getContextAnnotation(OMSBigDecimalFormat.class);
}
BigDecimalSerializer bigDecimalSerializer = new BigDecimalSerializer();
String tmp = "#####0.";
//打了自定义注解的字段
if (annotation != null) {
//获取想保留的小数位数
for (int i=0;i< annotation.value();i ){
tmp = tmp "0";
}
bigDecimalSerializer.format = tmp;
}
return bigDecimalSerializer;
}
return serializerProvider.findContentValueSerializer(beanProperty.getType(), beanProperty);
}
return serializerProvider.findNullValueSerializer(beanProperty);
}
}
2.自定义注解
代码如下:
/**
* OMS BigDecimal类自定义注解
*/
@Retention(RetentionPolicy.RUNTIME)//运行时注解
@Target(ElementType.FIELD)//作用于字段
@JacksonAnnotationsInside
@JsonSerialize(using = BigDecimalSerializer.class)//指定序列化器
public @interface OMSBigDecimalFormat {
int value() default 2;//bigDecimal保留的小数位数
}
3.参考
链接: JsonSerializer
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfhahbg
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01