当前位置: 首页 > 图灵资讯 > 技术篇> Spring Boot 如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值name值?

Spring Boot 如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值name值?

来源:图灵教育
时间:2023-11-20 16:16:21

前言

在 Spring Boot 在项目中经常使用 Swagger 生成文档和测试接口。在 Swagger 我们可以使用它 @ApiModelProperty 注释描述字段,例如添加字段名(name)和字段注释(value)。然而,在实际开发中,有时我们需要在这些注释中获得值,以便后续处理。本文将介绍如何获取 @ApiModelProperty 注解中的 value 值和 name 值。

摘要

本文将介绍如何结合源代码分析和实例应用场景 Spring Boot 项目中获取 @ApiModelProperty 注解中的 value 值和 name 值。

简介

Swagger 它是一种可以直接生成的开源接口文档生成工具 API 文档和测试接口,可以很容易地进行测试和调试。在 Spring Boot 在项目中,我们通过引入 springfox-swagger2 和 springfox-swagger-ui 两种依赖于集成 Swagger。然后,我们可以用它 @ApiModelProperty 注释描述字段,例如添加字段名(name)和字段注释(value)。@ApiModelProperty 注释的定义如下:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface ApiModelProperty {    String value() default "";    String name() default "";    boolean required() default false;    String allowableValues() default "";    boolean hidden() default false;    boolean readOnly() default false;    boolean allowEmptyValue() default true;    int position() default 0;    String example() default "";    Class<?>[] reference() default {};    String access() default "";    Class<?> type() default Void.class;    Union[] unions() default {};    @Target({ElementType.TYPE})    @Retention(RetentionPolicy.RUNTIME)    @Documented    public @interface Union {        Class<?>[] implementation() default {};        boolean anyOf() default false;    }}

其中,value 属性表示字段注释,name 属性表示字段名。

源代码解析

我们可以通过反射获得类中的字段 @ApiModelProperty 注释,然后得到它 value 和 name 属性的值。

以下是获取 value 和 name 属性值示例代码:

import io.swagger.annotations.ApiModelProperty;import java.lang.reflect.Field;public class GetAnnotationValueExample {    @ApiModelProperty(value = "序列号", name = "uuid")    private String serialNumber;    public static void main(String[] args) throws NoSuchFieldException {        Field field = GetAnnotationValueExample.class.getDeclaredField("serialNumber");        ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);        String value = annotation.value();// 序列号        String name = annotation.name();// uuid        System.out.println("value: " + value);        System.out.println("name: " + name);    }}

在上述代码中,我们通过反射获得它 GetAnnotationValueExample 类中的 serialNumber 字段上的 @ApiModelProperty 注释,然后得到它 value 和 name 属性的值。

应用场景案例

在实际开发中,我们有时需要根据字段名获得相应的信息 @ApiModelProperty 注解中的 value 值和 name 值。例如,我们正在处理 Excel 在文件中,需要根据表头名称获得相应字段的值。具体实现可参考以下示例代码:

import io.swagger.annotations.ApiModelProperty;import java.lang.reflect.Field;import java.util.HashMap;import java.util.Map;public class GetAnnotationValueByNameExample {    @ApiModelProperty(value = "序列号", name = "uuid")    private String serialNumber;    public static void main(String[] args) {        GetAnnotationValueByNameExample example = new GetAnnotationValueByNameExample();        Map<String, String> map = example.getFieldNameAndValue();        String value = map.get("uuid");// 序列号        System.out.println("value: " + value);    }    public Map<String, String> getFieldNameAndValue() {        Map<String, String> map = new HashMap<>();        Field[] fields = this.getClass().getDeclaredFields();        for (Field field : fields) {            if (field.isAnnotationPresent(ApiModelProperty.class)) {                ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);                String fieldName = annotation.name();                String fieldValue = "";                field.setAccessible(true);                try {                    fieldValue = (String) field.get(this);                } catch (IllegalAccessException e) {                    e.printStackTrace();                }                map.put(fieldName, fieldValue);            }        }        return map;    }}

在上述代码中,我们首先获得它 GetAnnotationValueByNameExample 类中的所有字段,然后遍历字段,判断字段上是否有字段 @ApiModelProperty 注解。如果存在,就得到它 name 和 value 属性值,并将其保存到一个 Map 中。最后,我们可以根据 name 为了获得相应的 value 值。

优缺点分析

通过反射获得 @ApiModelProperty 注解中的 value 和 name 属性值可以很容易地处理描述的字段。然而,反射的使用会带来一定的性能损失,应谨慎使用。同时,如果在项目中重新命名字段名,则在注释中获得注释 name 属性值可能会失败。

介绍getanotationvalue的代码方法
public static String getAnnotationValue(Field field, Class annotationClass, String attributeName) {    if (field.isAnnotationPresent(annotationClass)) {        Annotation annotation = field.getAnnotation(annotationClass);        try {            Method method = annotationClass.getMethod(attributeName);            return (String) method.invoke(annotation);        } catch (Exception e) {            e.printStackTrace();        }    }    return null;}

该方法可以根据属性名获得相应注释中的属性值。

getFieldNameAndValue
public Map<String, String> getFieldNameAndValue(Class clazz, Object object) {    Map<String, String> map = new HashMap<>();    Field[] fields = clazz.getDeclaredFields();    for (Field field : fields) {        String fieldName = field.getName();        String fieldValue = "";        field.setAccessible(true);        try {            fieldValue = (String) field.get(object);        } catch (IllegalAccessException e) {            e.printStackTrace();        }        map.put(fieldName, fieldValue);    }    return map;}

该方法可以在一个对象中获得所有字段的名称和值,并将其保存到一个对象中 Map 中。

测试用例

以下是用于测试的测试用例 getAnnotationValue 方法和 getFieldNameAndValue 方法的正确性。

import io.swagger.annotations.ApiModelProperty;import java.lang.reflect.Field;import java.util.Map;public class AnnotationTest {    @ApiModelProperty(value = "序列号", name = "uuid")    private String serialNumber;    public static void main(String[] args) throws NoSuchFieldException {        AnnotationTest test = new AnnotationTest();        String value = test.getAnnotationValue("serialNumber", ApiModelProperty.class, "value");// 序列号        System.out.println("value: " + value);        Map<String, String> map = test.getFieldNameAndValue(test.getClass(), test);        String fieldValue = map.get("serialNumber");// abc        System.out.println("fieldValue: " + fieldValue);    }    public String getAnnotationValue(String fieldName, Class annotationClass, String attributeName) throws NoSuchFieldException {        Field field = this.getClass().getDeclaredField(fieldName);        return AnnotationUtils.getAnnotationValue(field, annotationClass, attributeName);    }}
全文小结

本文介绍了如何在这里 Spring Boot 项目中获取 @ApiModelProperty 注解中的 value 值和 name 值。我们可以通过反射获得类中的字段 @ApiModelProperty 注释,然后得到它 value 和 name 属性的值。本文还介绍了实际应用场景案例、方法的优缺点分析和代码方法。

总结

在开发过程中,有时我们需要获得注释中的属性值,以便于后续处理。我们可以通过反射轻松获得 @ApiModelProperty 注解中的 value 值和 name 值,易于处理。但是,反射会造成一定的性能损失,应谨慎使用。