java 实体类 临时注解_「干货」如何将反射和自定义注解应用在项目开发中

Java中的反射在Spring这些框架中应用的很频繁,比如Spring容器初始化Bean的过程等等,但是在实际的业务开发中自己却应用的很少。

最近的开发过程中正好有个这样的需求,有几个实体类中属性比较多,而且这些属性都是定义的返回金额字断,因为金额在计算过程中可能出现精度问题,所以定义金额字断属性都使用的BigDecimal进行修饰。在和前端对接的过程中发现有些金额字断返回的NULL,这样就产生了一些歧义,因为NULL和0并不是一码事,需要后端给出清晰返回,这个问题处理起来并不复杂,下面整理了几种处理方案:

26310907e8b47e6101272d683f0d28b6.png

参考方案

  1. 修改查询sql,查询时NULL的属性使用IFNULL函数转为0;
  2. 在属性的setXxx方法时统一判断一下如果set值为NULL则转换为返回BigDecimal.ZERO;
  3. 在属性上增加注解,返回实体信息时统一使用反射进行属性转换;

因为返回实体属性较多,第3种方案明显要优于第2种,这样不用大面积做属性转换,代码也更加简洁。相对于第3种方案来说,第1种需要重写sql,改动则较多。下面是具体实现方法:

1.定义注解

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface IsNullConvertZero {}

2.定义校验实体Util类

@Slf4jpublic class IsNullConvertZeroUtil {    public static Object checkIsNull(Object obj) {        try {            Class> clazz = obj.getClass();            //获得私有的成员属性            Field[] fields = clazz.getDeclaredFields();            if(Objects.nonNull(fields) && fields.length>0){                for(Field field : fields){                    field.setAccessible(true);                    //判断IsNullConvertZero注解是否存在                    if(field.isAnnotationPresent(IsNullConvertZero.class)){                        if(Objects.isNull(field.get(obj))){                            field.set(obj, BigDecimal.ZERO);                        }                    }                }            }        } catch (Exception e) {            log.error("IsNullConvertZeroUtil出现异常:{}",e);        }        return obj;    }}

3.定义返回实体类

@Data@ToStringpublic class ServcenterAccountDTO {    @IsNullConvertZero    private BigDecimal businessPaymentBeginBalance;    @IsNullConvertZero    private BigDecimal businessReceiptTodayAmount;    @IsNullConvertZero    private BigDecimal businessRefundTodayAmount;    @IsNullConvertZero    private BigDecimal tempReserveBeginBalance; /**     * 还有很多属性,就不罗列了     */}

4.使用示例

ServcenterAccountDTO servcenterAccountDTO = new ServcenterAccountDTO();servcenterAccountDTO.setBusinessPaymentBeginBalance(businessPaymentBeginBalance);servcenterAccountDTO.setBusinessReceiptTodayAmount(businessReceiptTodayAmount);servcenterAccountDTO.setBusinessRefundTodayAmount(businessRefundTodayAmount);servcenterAccountDTO.setTempReserveBeginBalance(tempReserveBeginBalance);/**  * 还有很多属性,就不罗列了 *///通过反射校验注解将属性值NULL转为BigDecimal.ZEROIsNullConvertZeroUtil.checkIsNull(servcenterAccountDTO);return servcenterAccountDTO;       

以上就是反射和自定义注解的一个简单应用。

不断分享开发过程用到的技术和面试经常被问到的问题,如果您也对IT技术比较感兴趣可以「关注」我

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值