JAVA--fastJSON+自定义注解格式化实体字段
2017-07-19 16:47
274 查看
公司有个需求,给所有身份证,姓名,银行卡号,后台打印日志进行格式化如:身份证:431103******9999,姓名:张*红。主要作用是为了保密商户的资料。
拿到这样一个需求的时候,我首先想到的是,那么多个实体,每个实体身份证,姓名,银行卡可能字段命名是不一样的,那我怎么去做一个通用的方法,怎么才知道某个实体中某个字段需要进行格式化,是进行什么类型的格式~
经过思考,查找资料确定fastjson+fastjson过滤器+java自定义注解+java反射。Fastjson用于以json的方式打印对象日志,java注解用于标识某个实体类中某个字段需要进行何种格式化,加上java反射,后面新增实体某个字段需要进行格式化直接添加一个自定义注解,然后调用fastjson+过滤器即可进行格式化。一劳永逸呀!
实例如下:
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.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方法
}
import com.alibaba.fastjson.JSONObject;
JSONObject.toJSONString(bean,newBeanPropertyFilter())
拿到这样一个需求的时候,我首先想到的是,那么多个实体,每个实体身份证,姓名,银行卡可能字段命名是不一样的,那我怎么去做一个通用的方法,怎么才知道某个实体中某个字段需要进行格式化,是进行什么类型的格式~
经过思考,查找资料确定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())
相关文章推荐
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- Spring data jpa 自定义查询返回,用FastJson把Map转换为JavaBean
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- 数据脱敏——基于Java自定义注解实现日志字段脱敏
- 自定义Json注解实现输出日志字段脱敏
- fastjson @JSONField自定义输出字段
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- java 自定义注解验证 (仅限于实体属性值上的注解)
- 【FastJSON坑】--- java实体包含实体转换JSON报错
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- java fastjson如何自定义转换含枚举类型对象(编程技巧)
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- Jackson @JsonView注解自定义返回POJO类的字段
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- fastjson @JSONField自定义输出字段
- java fastjson如何自定义转换含枚举类型对象(编程技巧)
- Android中Gson解析json数据使用@SerializedName注解与java对象不匹配的字段
- fastjson 格式化自定义选项
- Java自定义注解
- Java注解教程及自定义注解