自定义注解(中英文字段名字映射)

自定义注解(中英文字段名字映射)现在需要增加一个接口,前端传入空,后端返回字段的英文名和对应的中文名

需求:

现在需要增加一个接口,前端传入空,后端返回字段的英文名和对应的中文名。

解决方案:

可以自定义一个注解,通过反射获取到注解以及注解的内容,再以map封装好返回给前端。
1)自定义注解类:

//指定注解使用的目标范围(类、方法、字段等)此处指定为字段
@Target({ 
   ElementType.FIELD})
//指定注解的生命周期(源码、class文件、运行时)
//此处为始终不会丢弃,运行期也保留该注解,自定义的注解通常使用这种方式
@Retention(RetentionPolicy.RUNTIME)
//指定子类可以继承父类的注解,只能是类上的注解,方法和字段的注解不能继承
@Inherited
public @interface NameMapping { 
   

    String enName() default "";

    String chName() default "";

	//判断是否要返回该字段的中英文映射内容,默认为true,即返回
    boolean isBack() default true;
}

2)在需要返回中英文内容的字段上面添加该注解:

@Data
public class ProductRes extends ProductEntity implements Serializable { 
   

    @ApiModelProperty("客户id")
    @NameMapping(enName = "customerId", chName = "客户id")
    private Long customerId;

    @ApiModelProperty("客户姓名")
    private String customerName;
}
@Data
public class ProductEntity extends BaseEntity { 
   

    @ApiModelProperty("单位Id")
    private Long unitId;

    @ApiModelProperty("单位组Id")
    private Long unitGroupId;
}
@Data
public class BaseEntity implements Serializable { 
   
	@ApiModelProperty("货品id")
    @NameMapping(enName = "productId", chName = "货品id")
    private Long productId;

	@ApiModelProperty("企业id")
    private Long corpId;

	@ApiModelProperty("价格")
    @NameMapping(enName = "price", chName = "价格")
    private BigDecimal price;
}

3)通过反射获取注解及注解内容:

@Override
public Response<Map<String, String>> productNameMappingDetail() { 
   

    Map<String, String> map = new HashMap<>();

    //Class clazz = Class.forName("com.tiger.common.entity.product.response.ProductRes");
    ProductRes res = new ProductRes ();
    Class clazz = res.getClass();
    Field[] fields = clazz.getDeclaredFields();

	//获得被继承类的属性
    Class clazzSup = clazz.getSuperclass();
    Field[] fieldsSup = clazzSup.getDeclaredFields();

    Class clazzSupS = clazzSup.getSuperclass();
    Field[] fieldsSupS = clazzSupS.getDeclaredFields();

    for (Field field : fields) { 
   
        //此处判断当前字段上是否有@NameMapping注解,没有的话就跳过
        if (field.getAnnotation(NameMapping.class) != null) { 
   
            NameMapping nm = field.getAnnotation(NameMapping.class);
            map.put(nm.enName(), nm.chName());
        }
    }

    for (Field field : fieldsSup) { 
   
        if (field.getAnnotation(NameMapping.class) != null) { 
   
            NameMapping nm = field.getAnnotation(NameMapping.class);
            map.put(nm.enName(), nm.chName());
        }
    }

    for (Field field : fieldsSupS) { 
   
        if (field.getAnnotation(NameMapping.class) != null) { 
   
            NameMapping nm = field.getAnnotation(NameMapping.class);
            map.put(nm.enName(), nm.chName());
        }
    }

    return responseUtil.buildSuccessResponse(map);
}

此处需要注意的是,

getFields()可以获得本类及被继承类的所有public属性,而getDeclaredFields()可以获取到该类的全部属性,包括私有属性,但无法获得被继承类的属性。

所以我们要通clazz.getSuperclass()方法获得被继承类。

至此完成。

今天的文章自定义注解(中英文字段名字映射)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/61367.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注