首先,我们需要引入参数校验依赖 :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
我们最传统的对从前端传来的数据进行判断的方式是这样:
package lh1.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@SuppressWarnings("all")
@Controller
public class MyController1 {
@RequestMapping("/t1")
@ResponseBody
public String t1(String username){
if(username==null||"".equals(username)){}
System.out.println(username);
return "请求成功!";
}
}
1.springboot参数校验——简单数据类型
@Controller
@Validated
@SuppressWarnings("all")
public class MyController {
@RequestMapping("/t1")
@ResponseBody
public String t1(@NotBlank String username){
System.out.println(username);
return "请求成功";
}
}
结果如下:
如果参数为空则会出现以下结果:
2.springboot参数校验——异常处理
当抛出ConstraintViolationException 异常后,我们可以使用SpringMVC的异常处理器,也可以使用SpringBoot自带的异常处理机制。 当程序出现了异常,SpringBoot会使用自带的Basic ErrorController对象处理异常。该处理器会默认跳转到/resources/templates/error.html 页面。
package spring.vaildemo1.Controller;
import jakarta.validation.constraints.NotBlank;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@Validated
@SuppressWarnings("all")
public class MyController {
@RequestMapping("/t1")
@ResponseBody
public String t1(@NotBlank(message = "用户名不能为空") String username){
System.out.println(username);
return "请求成功";
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>错误页面</title>
</head>
<body>
<h1>服务器异常</h1>
</body>
</html>
3.SpringBoot参数校验_校验相关注解
注解 |
作用 |
@NotNull |
判断包装类是否为null |
@NotBlank |
判断字符串是否为null或者是空串(去掉首尾空格) |
@NotEmpty |
判断集合是否为空 |
@Length |
判断字符的长度(最大或者最小) |
@Min |
判断数值最小值 |
@Max |
判断数值最大值 |
|
判断邮箱是否合法 |
@RequestMapping("/t2")
@ResponseBody
public String t2(@NotBlank(message = "字符串不能为空")@Length(min = 1,max = 5) String name,
@NotNull @Min(10) @Max(100) Integer age,
@NotEmpty @RequestParam List<String> address,
@NotBlank @Email String email
){
System.out.println(name);
System.out.println(age);
System.out.println(address);
System.out.println(email);
return "请求成功!";
}
请求成功!!!
接下来我们修改参数列举出现的错误:
邮箱格式错误时:
年龄超出范围时:
在这里初学同学们有可能不了解@RequestParam这个注解的含义是什么:
在Spring MVC中,@RequestParam
是一个用于将请求参数映射到控制器处理方法的参数上的注解。当你需要处理请求中的集合(例如,多个相同名称的查询参数)时,可以在 @RequestParam
中指定一些额外的属性来帮助 Spring 正确地绑定这些参数。
以下是一些在处理集合时可能需要使用 @RequestParam
的情况:
-
处理多个值:当一个请求参数在查询字符串中有多个值时(例如,
?id=1&id=2&id=3
),你可以使用@RequestParam
来收集这些值。 -
指定数组或集合:通过在
@RequestParam
中设置required = false
,你可以告诉 Spring,即使请求中没有该参数,也不应该抛出异常。此外,你可以通过defaultValue
属性提供一个默认值。 -
使用特定的数据类型:你可以指定一个具体的数据类型(如
List<String>
或Set<Integer>
),Spring 会尝试将请求参数的值转换为该类型。
示例
假设你有一个查询字符串 ?id=1&id=2&id=3
,并且你想要将这些值绑定到一个 List<Integer>
中,你可以这样做:
@GetMapping("/search")
public void searchByIds(@RequestParam("id") List<Integer> ids) {
// 使用ids集合
}
在这个例子中,@RequestParam("id")
告诉 Spring,你想要获取名称为 id
的请求参数,并且期望它被绑定到一个 List<Integer>
类型的变量中。
如果你不使用 @RequestParam
,Spring 将不知道如何处理同名的多个请求参数,或者如何将它们绑定到方法参数上。
4.SpringBoot参数校验_对象类型
@RequestMapping("/t3")
@ResponseBody
//校验的对象参数前需要添加@Validated,并将异常信息封装到BindingResult
public String t3(@Validated student s, BindingResult result){
//判断是否有参数异常
if(result.hasErrors()){
//遍历异常信息,输出异常信息
List<ObjectError> allErrors = result.getAllErrors();
for(ObjectError error : allErrors){
FieldError fieldError = (FieldError) error;
System.out.println(fieldError.getDefaultMessage());
}
throw new RuntimeException();
}
System.out.println(s);
return "请求成功!";
}
package spring.vaildemo1.domain;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
@SuppressWarnings("all")
public class student {
@NotNull(message = "id不能为空")
private Integer id;
@NotBlank(message = "姓名不能为空")
private String name;
public student(Integer id, String name) {
this.id = id;
this.name = name;
}
public student() {
}
public @NotNull(message = "id不能为空") Integer getId() {
return id;
}
public void setId(@NotNull(message = "id不能为空") Integer id) {
this.id = id;
}
public @NotBlank(message = "姓名不能为空") String getName() {
return name;
}
public void setName(@NotBlank(message = "姓名不能为空") String name) {
this.name = name;
}
@Override
public String toString() {
return "student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
name为空时