您的位置:首页 > 编程语言 > Java开发

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

2017-07-19 16:47 274 查看
         公司有个需求,给所有身份证,姓名,银行卡号,后台打印日志进行格式化如:身份证: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())
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: