SpringBoot进行参数校验的方法详解

SpringBoot进行参数校验的方法详解

一、为什么需要参数校验?

在实际开发中,我们常常需要对一些参数进行校验,防止参数不合法导致程序出错。比如在登录界面中,用户名和密码不能为空,当用户输入的用户名密码为空时,我们需要提示用户输入正确的用户名和密码。如果没有对参数进行校验,程序会直接抛出空指针异常,这是非常不可取的。

二、SpringBoot参数校验的方式

SpringBoot提供了多种方式来进行参数校验,下面我们将详细介绍两种常用的方式。

1.注解方式

在实体类中使用注解来完成参数校验。具体步骤如下:

1.在实体类中添加注解@javax.validation.constraints,例如:

public class User{
   @NotBlank(message = "用户名不能为空")
   private String username;

   @NotBlank(message = "密码不能为空")
   private String password;
}

2.使用@Valid注解在Controller层对参数进行校验,例如:

@RestController
@RequestMapping("/user")
public class UserController {

   @PostMapping("/login")
   public String login(@Valid @RequestBody User user, BindingResult bindingResult) {
      if(bindingResult.hasErrors()){
         return bindingResult.getAllErrors().toString();
      }
      return "login";
   }
}

2.自定义校验注解

我们也可以通过自定义注解来进行参数校验,具体步骤如下:

1.自定义注解,例如:

@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
@Documented
public @interface Password {
   String message() default "密码必须由6-16位数字或字母组成";
   Class<?>[] groups() default { };
   Class<? extends Payload>[] payload() default { };
}

2.定义校验器PasswordValidator,例如:

public class PasswordValidator implements ConstraintValidator<Password, String> {

   @Override
   public void initialize(Password constraintAnnotation) {

   }

   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
      Pattern pattern = Pattern.compile("^[a-zA-Z0-9]{6,16}$");
      Matcher matcher = pattern.matcher(value);
      return matcher.matches();
   }
}

3.在实体类中使用自定义注解,例如:

public class User{
   @NotBlank(message = "用户名不能为空")
   private String username;

   @Password
   private String password;
}

4.使用@Valid注解在Controller层对参数进行校验,例如:

@RestController
@RequestMapping("/user")
public class UserController {

   @PostMapping("/login")
   public String login(@Valid @RequestBody User user, BindingResult bindingResult) {
      if(bindingResult.hasErrors()){
         return bindingResult.getAllErrors().toString();
      }
      return "login";
   }
}

三、示例

下面我们通过示例来演示使用注解和自定义注解的方式进行参数校验。

1.注解方式示例

@RestController
@RequestMapping("/user")
public class UserController {

   @PostMapping("/login")
   public String login(@Valid @RequestBody User user, BindingResult bindingResult) {
      if(bindingResult.hasErrors()){
         return bindingResult.getAllErrors().toString();
      }
      return "login";
   }
}

调用POST接口{{host}}/user/login,传入json参数:

{
   "username": "",
   "password": ""
}

则返回结果为:

[{"codes":["NotBlank.user.username","NotBlank.username","NotBlank.java.lang.String","NotBlank"],"arguments":[{"codes":["user.username","username"],"arguments":null,"defaultMessage":"username","code":"username"},{"defaultMessage":"Default","codes":["javax.validation.constraints.NotBlank.message","NotBlank.message","javax.validation.constraints.NotBlank"],"arguments":null,"code":"NotBlank"}],"defaultMessage":"用户名不能为空","objectName":"user","field":"username","rejectedValue":"","bindingFailure":false,"code":"NotBlank"}]

2.自定义注解方式示例

@RestController
@RequestMapping("/user")
public class UserController {

   @PostMapping("/register")
   public String register(@Valid @RequestBody RegisterForm registerForm, BindingResult bindingResult) {
      if(bindingResult.hasErrors()){
         return bindingResult.getAllErrors().toString();
      }
      return "register";
   }
}

自定义注解@Phone和校验器PhoneValidator:

@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
@Documented
public @interface Phone {
   String message() default "手机号格式不正确";
   Class<?>[] groups() default { };
   Class<? extends Payload>[] payload() default { };
}


public class PhoneValidator implements ConstraintValidator<Phone, String> {

   @Override
   public void initialize(Phone constraintAnnotation) {

   }

   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
      Pattern pattern = Pattern.compile("^[1][3-9][0-9]{9}$");
      Matcher matcher = pattern.matcher(value);
      return matcher.matches();
   }
}

RegisterForm实体类:

public class RegisterForm {
   @NotBlank(message = "用户名不能为空")
   private String username;

   @NotBlank(message = "密码不能为空")
   private String password;

   @Phone
   private String phone;
}

调用POST接口{{host}}/user/register,传入json参数:

{
   "username": "user1",
   "password": "123456",
   "phone": "12345678900"
}

则返回结果为:

"register"

如果传入json参数:

{
   "username": "user2",
   "password": "123456",
   "phone": "1234567890"
}

则返回结果为:

[{"codes":["Phone.registerForm.phone","registerForm.phone","phone","java.lang.String","Phone"],"arguments":[{"codes":["registerForm.phone","phone"],"arguments":null,"defaultMessage":"phone","code":"phone"},{"defaultMessage":"Default","codes":["amethyst.constraint.Phone.message","Phone.message","javax.validation.constraints.Pattern.message","javax.validation.constraints.Pattern"],"arguments":null,"code":"Phone"}],"defaultMessage":"手机号格式不正确","objectName":"registerForm","field":"phone","rejectedValue":"1234567890","bindingFailure":false,"code":"Phone"}]

以上就是SpringBoot进行参数校验的详细攻略,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot进行参数校验的方法详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 解决引用slf4j中Logger.info只打印出文字没有数据的问题

    解决slf4j中Logger.info只打印出文字没有数据的问题,需要先了解 slf4j 和logback 原理。 1.了解 slf4j 和logback slf4j slf4j 是一个抽象化的log日志框架,不提供日志的实现,使用者可以根据需要使用具体的实现。 logback logback是slf4j的一个实现,是log4j框架的作者开发的一种新的日志框…

    Java 2023年5月26日
    00
  • SpringBoot概述及在idea中创建方式

    SpringBoot概述 Spring Boot是一个开源的Java框架,它摆脱了传统Spring框架的繁琐配置,建立在Spring Framework的基础之上。Spring Boot提供了一种快速简便的方式来搭建Java应用程序,并且默认设置对各种Spring组件、外部组件、配置管理等进行了很好的支持。 Spring Boot使用“约定大于配置”的方式来…

    Java 2023年5月15日
    00
  • 全面解析java中的hashtable

    全面解析java中的Hashtable 介绍 Hashtable是Java中提供的一种哈希表数据结构的实现,它实现了Map接口,采用键/值对的方式存储数据,并根据键的哈希值存储和访问数据,具有快速查找的优势。 Hashtable是线程安全的,因为它的所有方法都是同步的,但这也导致在高并发情况下性能较低,在JDK1.5之后,Java提供了ConcurrentH…

    Java 2023年5月26日
    00
  • Tomca启动闪退问题解决(八大类)

    针对 “Tomcat启动闪退问题” 的解决攻略,我可以提供以下的具体步骤来解决这个问题,该过程中可能包含多个方面的解决方法: 1. 确认Java环境是否正常 首先需要检查Java环境是否正常,在命令行中输入Java -version来查看Java版本是否正确显示。如果没有显示,则需要重新安装并配置Java环境。 2. 检查Tomcat配置 其次需要检查Tom…

    Java 2023年5月19日
    00
  • LibrarySystem图书管理系统(二)

    LibrarySystem图书管理系统(二)攻略 一、概述 本文主要针对“LibrarySystem图书管理系统(二)”的学习内容,进行详细的攻略说明,包括系统的整体架构、功能模块及其实现方式等。 二、整体架构 LibrarySystem图书管理系统(二)是一个基于Java Web技术实现的图书管理系统,主要包含以下几个模块: 图书管理模块 图书借阅模块 图…

    Java 2023年5月24日
    00
  • java学生信息管理系统设计与实现

    Java学生信息管理系统设计与实现 设计思路 功能模块 该系统主要包含以下几个功能模块: 学生信息录入和查询:可添加、修改、删除和查询学生的基本信息,包括学号、姓名、性别、年龄等。 成绩信息录入和查询:可添加、修改、删除和查询学生的各科成绩信息,包括语文、数学、英语等。 成绩统计和排名:可对学生的各科成绩进行统计,包括总分、平均分、最高分、最低分等,并进行排…

    Java 2023年5月23日
    00
  • 基数排序算法的原理与实现详解(Java/Go/Python/JS/C)

    基数排序算法的原理与实现详解(Java/Go/Python/JS/C) 算法简介 基数排序是一种非比较的排序算法,它通过将数组中的元素从低位到高位依次进行排序,最终实现整个数组的排序。基数排序算法不同于其他排序算法,其不基于比较算法进行排序,因此拥有O(n)的时间复杂度。基数排序算法对于大数据量、高位数的数组排序具有优势。 算法实现 基数排序算法可以使用Ja…

    Java 2023年5月19日
    00
  • Java笔记(15) Collection集合–>List集合

    集合的理解和好处数组一旦定义,长度即固定,不能修改。要添加新元素需要新建数组,然后循环拷贝,非常麻烦 集合可以动态保存任意多个对象,使用比较方便 提供饿了一系列方便的操作对象的方法:add、remove、set、get等 使用集合添加、删除新元素的示意代码,简洁明了 集合主要是两组(单列集合,双列集合)Collection 接口有两个重要的子接口,List …

    Java 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部