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

yizhihongxing

请您看下面的攻略。

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日

相关文章

  • KMPlayer播放器怎么自制自定义电影缩略图?

    KMPlayer是一款免费的多媒体播放器,它提供了丰富的视频播放功能和自定义选项。其中之一就是自定义电影缩略图。下面是自制自定义电影缩略图的完整攻略: 步骤一:准备缩略图图片 在自制电影缩略图之前,需要先准备好缩略图图片。图片的格式可以是JPG、PNG或BMP等。图片的尺寸可以根据自己的需要调整,但建议不要太大,以免影响播放器的运行速度。 示例:假设我要为电…

    other 2023年6月25日
    00
  • IBM X System ServerGuide 8.41 服务器 系统安装 引导盘图文教程

    IBM X System ServerGuide 8.41 服务器 系统安装 引导盘图文教程 本教程将为您提供IBM X System ServerGuide 8.41 服务器系统安装引导盘的详细攻略。此教程适用于需要安装OS/2、SCO OpenServer、SCO UnixWare、Microsft Windows NT等操作系统的IBM服务器。 硬件要…

    other 2023年6月27日
    00
  • macvtap使用教程

    以下是“Macvtap使用教程的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: Macvtap使用教程 Macvtap是一种虚拟网络设备,可以用于将物理网络适配器的流量传输到虚拟机中。本文将介绍如何使用Macvtap,包括如何创建Macvtap设备、如何将Macvtap设备分配给虚拟机等。 1. 创建Macvtap设备 在Linux系统中…

    other 2023年5月10日
    00
  • Android音视频开发只硬件解码组件MediaCodec讲解

    Android音视频开发只硬件解码组件MediaCodec讲解 什么是MediaCodec MediaCodec是Android提供的一种硬件解码组件,通过MediaCodec可以将硬件解码器(比如硬解码器)的硬件加速模块进行利用以提高视频进行解码的速度。 相比于软解码,硬解码可以有效的提高解码速度,使得更多的设备可以进行高清视频的播放。 使用MediaCo…

    other 2023年6月27日
    00
  • 在scrollView中使用pageControl

    在scrollView中使用pageControl的完整攻略 在iOS开发中,scrollView是一个常用的控件,用于显示大量内容。而pageControl则是一个用于指示scrollView当前页数的控件。本文将为您提供一份详细的在scrollView中使用pageControl的完整攻略,包括基本概念、使用方法和两个示例说明。 基本概念 在iOS中,s…

    other 2023年5月5日
    00
  • 三星S4关闭后台应用程序方法图文介绍

    三星S4关闭后台应用程序方法图文介绍 1. 从主屏幕进入任务管理器 在三星S4手机上关闭后台应用程序,首先需要进入任务管理器。在主屏幕下方,您可以看到一个“应用程序”图标。请点击该图标,然后您可以进入应用程序列表。接下来,您需要在下方找到“任务管理器”图标,并点击进入。 示例1:关闭单个应用程序 在进入任务管理器后,您可以看到您正在运行的所有应用程序。请滑动…

    other 2023年6月25日
    00
  • 如何在windows7安装u盘中加入usb3.0驱动的支持

    如何在Windows 7安装U盘中加入USB3.0驱动的支持 当我们使用U盘在Windows 7上安装系统时,如果电脑主板支持USB3.0接口,就需要在U盘中加入USB3.0驱动,否则会出现安装过程中U盘无法识别的问题。本文将介绍如何在Windows 7上使用DISM命令将USB3.0驱动集成到U盘中。 准备工作 在开始之前,我们需要准备以下工具: 一台装有…

    其他 2023年3月28日
    00
  • C++ 静态成员的类内初始化详解及实例代码

    如题所述,本文将详细讲解关于C++中静态成员的类内初始化的整个流程。在本文的实现过程中,我们将会提供两个示例来帮助读者更好的理解和掌握相关内容。 一、静态成员变量概述 在开始讲解静态成员的类内初始化之前,我们先来了解一下静态成员变量的概念。静态成员变量是属于所有类的实例共享的,不同的对象可以访问相同的静态成员变量,同时,静态成员变量声明时不需要在类外部再进行…

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