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日下午441
*
*/
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日下午121
*
*/
@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
版权声明:本文为博主原创文章,转载请附上博文链接!
还没有评论,来说两句吧...