SpringBoot参数校验

首先,我们需要引入参数校验依赖 :

        <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

判断数值最大值

@Email

判断邮箱是否合法

@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 的情况:

  1. 处理多个值:当一个请求参数在查询字符串中有多个值时(例如,?id=1&id=2&id=3),你可以使用 @RequestParam 来收集这些值。

  2. 指定数组或集合:通过在 @RequestParam 中设置 required = false,你可以告诉 Spring,即使请求中没有该参数,也不应该抛出异常。此外,你可以通过 defaultValue 属性提供一个默认值。

  3. 使用特定的数据类型:你可以指定一个具体的数据类型(如 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为空时

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无缘过去@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值