SpringBoot中自定义注解实现参数非空校验的示例

请您看下面的攻略。

SpringBoot中自定义注解实现参数非空校验的示例

1. 背景

在 SpringBoot 开发中,经常需要对方法的参数进行校验,确保参数的正确性。而参数非空校验是其中很重要的一项,避免了因为空指针等异常而导致程序崩溃。

无论你是使用 SpringMVC 的 @RequestParam、@PathVariable 注解获取请求参数,还是使用通用的 POJO 类封装参数,都需要进行参数校验。SpringBoot 提供了多种校验方式:使用 @NotNull、@NotEmpty、@NotBlank 注解等,在 Controller 方法上加上 @Validated 注解即可。但是,当需要大量重复输入校验注解时,会造成代码冗余。同时,不同开发者对于同一个参数可能会使用不同的校验规则,容易造成代码的混乱。

为此,本文会介绍使用自定义注解实现参数非空校验的示例,降低校验代码的冗余和混乱。

2. 实现步骤

2.1 创建注解类

首先,在我们的项目中创建一个注解类,用于标记需要进行非空校验的参数。我们可以通过 @Target 和 @Retention 注解,指定注解的作用对象和生命周期。

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface NotNullParam {
    String value() default "";
    String message() default "参数不能为空";
}

以上代码中,我们创建了一个名为 NotNullParam 的注解类。其中,@Target(ElementType.PARAMETER) 表示该注解只能作用于方法的参数上;@Retention(RetentionPolicy.RUNTIME) 表示注解的生命周期为运行时期。注解还提供了两个属性 value 和 message,value 属性可以用于指定注解名称;message 属性可以指定在参数为空时返回的提示信息,默认为 "参数不能为空"。

2.2 创建校验器

接下来,我们需要创建一个校验器类,用于对我们的注解进行校验。我们可以通过实现 Spring 的 Validator 接口实现该校验器,该接口提供了两个方法:supports 和 validate。

@Component
public class NotNullValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return Object[].class == clazz;
    }

    @Override
    public void validate(Object target, Errors errors) {
        Object[] params = (Object[]) target;
        for (int i=0; i<params.length; i++) {
            Object param = params[i];
            if (param == null) {
                NotNullParam annotation = getNotNullParamAnnotation(i, params);
                String paramName = annotation.value();
                if (StringUtils.isEmpty(paramName)) {
                    paramName = "参数" + i;
                }
                errors.reject(String.valueOf(i), paramName + "不能为空");
            }
        }
    }

    private NotNullParam getNotNullParamAnnotation(int index, Object[] params) {
        MethodParameter parameter = new MethodParameter(getClass().getMethods()[0], index);
        return parameter.getParameterAnnotation(NotNullParam.class);
    }
}

以上代码中,我们创建了一个名为 NotNullValidator 的校验器类,其中,@Component 表示该类为 Spring 的一个组件,会自动扫描并注入到 Spring 容器中。该校验器实现了 Spring 的 Validator 接口,并实现了 supports 和 validate 两个方法。

在 supports 方法中,我们使用 Object[].class == clazz 来指定该校验器支持的校验对象类型,这里我们使用数组类型 Object[],因为我们希望对当前方法的参数列表进行校验。

在 validate 方法中,我们首先将校验对象转换为参数数组 params,并对 params 的每一个元素进行非空判断,如果该参数为空,则获取它的注解和位置信息,并使用 errors.reject 方法将错误信息加入校验结果中。

同时,我们还提供了一个 getNotNullParamAnnotation 方法,用于获取 NotNullParam 注解。其中,我们使用 MethodParameter 类获取 Method 对象和参数下标 index,并使用该参数下标获取对应的 NotNullParam 注解。

2.3 使用自定义注解

最后,我们使用自定义注解进行参数校验。我们只需要在需要进行校验的参数上,加上我们刚刚创建的注解即可。

@RequestMapping("/test")
@RestController
public class TestController {

    @Autowired
    private NotNullValidator notNullValidator;

    @GetMapping("/hello")
    public String hello(@NotNullParam("name") String name,
                        @NotNullParam("age") Integer age) {
        notNullValidator.validate(new Object[]{name, age}, new BeanPropertyBindingResult(new Object[]{name, age}, "hello"));
        return "hello, " + name + ", " + age;
    }
}

以上代码中,我们在 Controller 的 hello 方法中,定义了两个接收参数的注解 @NotNullParam。这里我们还使用了 Autowired 注解,注入了我们刚刚创建的 NotNullValidator 校验器。

在方法参数中,我们通过使用 NotNullParam 注解,对当前参数进行非空校验。在方法体中,我们使用 notNullValidator.validate 方法进行校验,第一个参数传入需要校验的参数列表,第二个参数传入 errors,它是校验结果的封装类。

由于我们现在只提供了一个参数校验器,与目前的需求比较简单,所以当前校验器并没有模拟一个更完整的校验结果。如果我们有更复杂的校验需求,可以使用 Spring 提供的 Validated 注解和 BindingResult 类,它们提供了更详细和复杂的校验结果。

示例说明

  1. 在编写上述 @NotNullParam 注解时,我们添加了默认的 message 属性,以便在参数为空时提供一个默认的校验信息。如果需要自定义校验信息,可以使用 @NotNullParam(message="xxx") 的方式进行修改。
  2. 在校验器的 validate 方法中,我们只实现了简单的参数非空校验,实际开发中,我们可以根据不同的需求,添加各种校验规则,并将错误信息交给 errors 对象来封装。在直接调用校验器进行校验时,我们可以直接使用 Object[] 来进行校验,也可以使用对应的参数类型的包装类来进行校验,如 List、Map、DTO 对象等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot中自定义注解实现参数非空校验的示例 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Xp系统安装或运行软件时提示“EXE不是有效Win32应用程序”的故障原因及解决方法

    Xp系统安装或运行软件时提示“EXE不是有效Win32应用程序”的故障原因及解决方法 故障原因 当Windows XP系统尝试运行或安装应用程序时,可能会收到“EXE不是有效Win32应用程序”的错误消息。这是由于以下原因之一造成的: 应用程序文件损坏。可能是应用程序文件丢失、文件损坏或被破坏等引起。 不完整的应用程序安装。如果应用程序安装文件已被破坏或文件…

    other 2023年6月25日
    00
  • xmind8激活为pro教程-windows&mac

    以下是XMind8激活为Pro版的完整攻略,包括Windows和Mac两个平台的示例说明。 Windows平台 以下是在Windows平台上激活XMind8 Pro版的基本步骤: 下载XMind8 在XMind官网上下载XMind8的安装程序。 安装XMind8 运行下载的安装程序,按照提示完成XMind8的安装。 获取XMind8的序列号 在XMind官网…

    other 2023年5月6日
    00
  • 避免重装delphi 重装操作系统后的处理方法

    避免重装Delphi:重装操作系统后的处理方法攻略 在重装操作系统后,为了避免重装Delphi,您可以采取以下步骤来处理: 1. 备份Delphi安装文件和设置 在重装操作系统之前,务必备份Delphi的安装文件和设置。这样,您可以在操作系统重新安装后,将这些文件还原到原来的位置,以避免重新安装Delphi。 示例说明1:假设您的Delphi安装文件位于C:…

    other 2023年7月27日
    00
  • mysql区间范围查询问题

    以下是“MySQL区间范围查询问题的完整攻略”的标准markdown格式文本,其中包含两个示例: MySQL区间范围查询问题的解决方法 MySQL中,我们经常需要进行区间范围查询,例如查询某个时间段内的数据、查询某个价格区间内的商品等。但是,在进行区间范围查询时,我们需要注意一些问题,以避免查询结果不准确或者查询效率低下。以下是MySQL区间范围查询问题的解…

    other 2023年5月10日
    00
  • css原子化项目落地可行性分析和探究

    CSS原子化项目落地可行性分析和探究 1. 什么是CSS原子化项目? CSS原子化项目是一种前端开发的方法论,旨在通过将CSS样式规则拆分为最小的可复用单元(称为原子类),从而实现更高效的开发和维护。通过使用这种方法,开发人员可以将样式从具体元素中分离出来,使其成为独立的、可扩展的样式类。 2. CSS原子化项目落地的可行性 在考虑CSS原子化项目的可行性时…

    other 2023年6月28日
    00
  • 深入剖析——float之个人见解

    深入剖析——float之个人见解 什么是float 在CSS中,float是一种常见的布局方式。具体来说,float可以使元素“浮动”起来,从而脱离正常的文档流,并可以围绕着其他元素排列。在网页中常常用来实现两栏式、三栏式等布局方式。 float属性有以下几个取值: left:将元素向左浮动 right:将元素向右浮动 none:元素不浮动(默认值) inh…

    其他 2023年3月28日
    00
  • qt笔记——moc(莫克)

    Qt笔记——moc(莫克)的完整攻略 1. 基本介绍 moc(Meta-Object Compiler)是Qt中的一个元对象编译器,可以将C++代码中的元对象信息提取出来,并生成相应的代码。在Qt中,元对象是指那些具有信号和槽制的类,moc可以将这些类中的信号和槽信息提取出来,并生成相应的代码,使得这些类可以支持信号和槽机制。 2. 用法 以下是使用moc的…

    other 2023年5月10日
    00
  • C++中简单的文本文件输入/输出示例详解

    下面我们来详细讲解C++中简单的文本文件输入/输出。 前置知识 在学习本文时,你需要掌握以下C++基础知识: 文件操作 C++流(包括输入流和输出流) 命名空间的使用 简介 简单来说,C++中文件的输入/输出就是指将程序中的数据读取、写入到文件中,或者将文件中的数据读取、写入到程序中。本文详细介绍了C++中如何使用文件流来进行文本文件的输入和输出操作,其中包…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部