公司有个需求,给所有身份证,姓名,银行卡号,后台打印日志进行格式化如:身份证: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
版权声明:本文为博主原创文章,转载请附上博文链接!