需求:
现在需要增加一个接口,前端传入空,后端返回字段的英文名和对应的中文名。
解决方案:
可以自定义一个注解,通过反射获取到注解以及注解的内容,再以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