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

yizhihongxing

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日

相关文章

  • springboot ehcache 配置使用方法代码详解

    来讲一下“springboot ehcache 配置使用方法代码详解”的完整攻略。 一、什么是Ehcache? Ehcache是一种开源的Java分布式缓存框架,可以在进程内或进程间缓存任意类型的对象,具有内存缓存、磁盘缓存、持久化缓存等多种缓存策略。 二、Spring Boot中配置Ehcache 1.添加Maven依赖 在Spring Boot项目中使用…

    Java 2023年5月20日
    00
  • springboot自定义redis-starter的实现

    下面我将详细讲解 Spring Boot 自定义 Redis Starter 的实现过程: 1. 编写 Redis Starter 的核心代码 Spring Boot 自定义 Starter 可以方便用户在项目中引入各种第三方组件。在这里我们需要编写一个 Redis Starter,使得用户可以通过 Spring Boot 自动配置方式来使用 Redis。 …

    Java 2023年5月19日
    00
  • java结束进程的实例代码

    下面是“Java结束进程的实例代码”完整攻略。 标题:Java结束进程的实例代码 介绍 有时候,在Java应用程序中,我们需要结束一个进程。一种常见的情况是,当我们在一个死循环中运行代码时,我们需要手动中断程序。本文将介绍如何在Java中结束进程,并提供一些实例代码以帮助您更好地理解。 使用System.exit(int status)方法结束进程 Java…

    Java 2023年5月23日
    00
  • Java实现数据库连接池的方法

    Java实现数据库连接池是一种提高性能和应用程序响应能力的有效方法。下面为大家介绍几种常见的Java实现数据库连接池的方法。 使用Apache DBCP实现连接池 Apache DBCP是Java中最常用的开源连接池之一,它是一个开源项目,由Apache软件基金会支持。它使用轻量级语言Java实现,可以通过简单的配置使用。下面是使用Apache DBCP实现…

    Java 2023年5月19日
    00
  • Java中SimpleDateFormat的使用方法

    下面是关于Java中SimpleDateFormat的使用方法的完整攻略,包含以下几个部分: SimpleDataFormat类的介绍 SimpleDataFormat类的常用构造方法 SimpleDataFormat类的常用方法 示例介绍 注意事项 1. SimpleDataFormat类的介绍 SimpleDataFormat是Java中处理日期和时间格…

    Java 2023年5月20日
    00
  • Tomcat报错:HTTP Status 500 (Wrapper cannot find servlet class)解决办法

    当Tomcat在运行Servlet时出现错误信息 “HTTP Status 500 – Wrapper cannot find servlet class”,这通常表示Tomcat无法找到指定的servlet class。出现这种情况通常有以下几种解决办法。 一、检查web.xml文件的元素是否存在或正确 在web.xml文件中声明了Servlet的元素指定…

    Java 2023年5月19日
    00
  • 解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码问题

    解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码问题的攻略如下: 问题一:解决idea中Terminal终端无法执行GIT命令 问题描述 在IDEA中使用Terminal终端时,执行git命令时出现如下错误提示: -bash: git: command not found 导致无法正常使用git命令。 解决方法 经过排查发现,…

    Java 2023年5月20日
    00
  • SpringMvc直接接收json数据自动转化为Map的实例

    讲解SpringMvc直接接收json数据自动转化为Map的实例的完整攻略如下: 1. 添加相关依赖 首先,我们需要添加SpringMvc相关的依赖。在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework</groupId> <artifactId&g…

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