JAVA--fastJSON+自定义注解格式化实体字段

公司有个需求,给所有身份证,姓名,银行卡号,后台打印日志进行格式化如:身份证:431103******9999,姓名:张*红。主要作用是为了保密商户的资料。

         拿到这样一个需求的时候,我首先想到的是,那么多个实体,每个实体身份证,姓名,银行卡可能字段命名是不一样的,那我怎么去做一个通用的方法,怎么才知道某个实体中某个字段需要进行格式化,是进行什么类型的格式~

         经过思考,查找资料确定fastjson+fastjson过滤器+java自定义注解+java反射。Fastjson用于以json的方式打印对象日志,java注解用于标识某个实体类中某个字段需要进行何种格式化,加上java反射,后面新增实体某个字段需要进行格式化直接添加一个自定义注解,然后调用fastjson+过滤器即可进行格式化。一劳永逸呀!

实例如下:

Fastjson过滤器
importjava.lang.reflect.Field;

 

importorg.apache.log4j.Logger;

importorg.springframework.util.StringUtils;

 

importcom.alibaba.fastjson.serializer.ValueFilter;

importcom.eptok.transfer.bean.FieldFomatAnnotation;

importcom.eptok.transfer.enums.AnnotationFomatType;

/**

 *

 * 类名称:BeanPropertyFilter  

 * 类描述: 进行字段值格式化,如银行卡,收付款人姓名,身份证号

 * 创建人:boys 

 * 创建时间:2017年7月17日下午4:05:41       

 *

 */

public class BeanPropertyFilter implements ValueFilter{

 

    private static final Logger logger  =Logger.getLogger(BeanPropertyFilter.class);

    private Fieldfield =null;

   

    @Override

    public Object process(Object obj, String name, Object value) {

       

        try {

   

            field = obj.getClass().getDeclaredField(name);

            value = getFormartValue( field , value );

           

        } catch(NoSuchFieldException e){

            return value;

        }catch (Exception e) {

           

            logger.error(obj+"BeanPropertyFilter CustomsInfo解析格式化file异常:",e);

            return value;

        }

       

        return value;

    }

   

    private static Object getFormartValue(Field field,Object value ){

       

        if(field.isAnnotationPresent(FieldFomatAnnotation.class)){

           

             AnnotationFomatType formatType = field.getAnnotation(FieldFomatAnnotation.class).formatType();

             

             //进行格式化

             value =  formart(formatType,value);

           

        }

        return value;

    }

    private static Object formart(AnnotationFomatTypeformatType,Object obj){

       

        String formatValue = "";

        if(obj==null){

            return"";

        }else if(obj instanceof String){

            formatValue = (String) obj;

        }else{

            return"非String类型!";

        }

       

        //银行卡格式化

        if(formatType.equals(AnnotationFomatType.BANK_NUM)){

        }

       

        //姓名格式化

        if(formatType.equals(AnnotationFomatType.NAME)){

        }

       

        //身份证号格式化

        if(formatType.equals(AnnotationFomatType.ID_CARD)){

        }

 

        return"";

    }

}

 

自定义注解
importjava.lang.annotation.ElementType;

importjava.lang.annotation.Retention;

importjava.lang.annotation.RetentionPolicy;

importjava.lang.annotation.Target;

importcom.eptok.transfer.enums.AnnotationFomatType;

 

/**

 *      

 * 类名称:FieldFomatAnnotation  

 * 类描述:用于注解实体类字段,打印日志格式化,如银行卡: 6225***2882;姓名:张**斌  

 * 创建人:boys 

 * 创建时间:2017年7月14日下午1:50:21       

 *

 */

@Retention(RetentionPolicy.RUNTIME)  

@Target(ElementType.FIELD)

public  @interface  FieldFomatAnnotation {

    public AnnotationFomatType formatType(); 

}

 

 

格式化类型枚举类
 

/** 注解格式化类型,姓名格式化,银行卡号格式化 */

public enum AnnotationFomatType {

    /** 姓名 */

    NAME,

    /** 银行卡 */

    BANK_NUM,

    /**身份证*/

    ID_CARD;

   

    public String getName() {

        return this.name();

    }

    public Integer getOrdinal() {

        return this.ordinal();

    }

}

 

 

需要格式化的实体类
 

public class TransferOrderBill implements java.io.Serializable {

 

    private static final long serialVersionUID = 7198819025939762530L;

    //企业提供 20位唯一码

    private StringserialNum;

   

    //付款人姓名

    @FieldFomatAnnotation(formatType = AnnotationFomatType.NAME)

    private StringcardHolder;

    //付款人账号

    @FieldFomatAnnotation(formatType = AnnotationFomatType.BANK_NUM)

    private StringbankAccount;

       

    //get set方法

}

 

 

 

 

测试
Main方法测试

import com.alibaba.fastjson.JSONObject;

 

JSONObject.toJSONString(bean,newBeanPropertyFilter())
--------------------- 
作者:BoysGoGo 
来源:CSDN 
原文:https://blog.csdn.net/yu459348471/article/details/75414749 
版权声明:本文为博主原创文章,转载请附上博文链接!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值