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

Bertha 。 2021-12-11 05:41 623阅读 0赞

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

  1. 拿到这样一个需求的时候,我首先想到的是,那么多个实体,每个实体身份证,姓名,银行卡可能字段命名是不一样的,那我怎么去做一个通用的方法,怎么才知道某个实体中某个字段需要进行格式化,是进行什么类型的格式~
  2. 经过思考,查找资料确定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{

  1. private static final Logger logger =Logger.getLogger(BeanPropertyFilter.class);
  2. private Fieldfield =null;
  3. @Override
  4. public Object process(Object obj, String name, Object value) \{
  5. try \{
  6. field = obj.getClass().getDeclaredField(name);
  7. value = getFormartValue( field , value );
  8. \} catch(NoSuchFieldException e)\{
  9. return value;
  10. \}catch (Exception e) \{
  11. logger.error(obj+"BeanPropertyFilter CustomsInfo解析格式化file异常:",e);
  12. return value;
  13. \}
  14. return value;
  15. \}
  16. private static Object getFormartValue(Field field,Object value )\{
  17. if(field.isAnnotationPresent(FieldFomatAnnotation.class))\{
  18. AnnotationFomatType formatType = field.getAnnotation(FieldFomatAnnotation.class).formatType();
  19. //进行格式化
  20. value = formart(formatType,value);
  21. \}
  22. return value;
  23. \}
  24. private static Object formart(AnnotationFomatTypeformatType,Object obj)\{
  25. String formatValue = "";
  26. if(obj==null)\{
  27. return"";
  28. \}else if(obj instanceof String)\{
  29. formatValue = (String) obj;
  30. \}else\{
  31. return"非String类型!";
  32. \}
  33. //银行卡格式化
  34. if(formatType.equals(AnnotationFomatType.BANK\_NUM))\{
  35. \}
  36. //姓名格式化
  37. if(formatType.equals(AnnotationFomatType.NAME))\{
  38. \}
  39. //身份证号格式化
  40. if(formatType.equals(AnnotationFomatType.ID\_CARD))\{
  41. \}
  42. return"";
  43. \}

}

自定义注解
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 {

  1. public AnnotationFomatType formatType();

}

格式化类型枚举类

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

public enum AnnotationFomatType {

  1. /\*\* 姓名 \*/
  2. NAME,
  3. /\*\* 银行卡 \*/
  4. BANK\_NUM,
  5. /\*\*身份证\*/
  6. ID\_CARD;
  7. public String getName() \{
  8. return this.name();
  9. \}
  10. public Integer getOrdinal() \{
  11. return this.ordinal();
  12. \}

}

需要格式化的实体类

public class TransferOrderBill implements java.io.Serializable {

  1. private static final long serialVersionUID = 7198819025939762530L;
  2. //企业提供 20位唯一码
  3. private StringserialNum;
  4. //付款人姓名
  5. @FieldFomatAnnotation(formatType = AnnotationFomatType.NAME)
  6. private StringcardHolder;
  7. //付款人账号
  8. @FieldFomatAnnotation(formatType = AnnotationFomatType.BANK\_NUM)
  9. private StringbankAccount;
  10. //get set方法

}

测试
Main方法测试

import com.alibaba.fastjson.JSONObject;

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

发表评论

表情:
评论列表 (有 0 条评论,623人围观)

还没有评论,来说两句吧...

相关阅读

    相关 json注解格式化字段

    > 实际开发中,我们一定遇到过这样的问题:前端显示和后台存储数据单位不统一,而且各有各自的理由,统一不了,那就转换吧。每次返回给前端时再转换一遍,返回给前端的json数据,在后