Spring MVC 参数校验

本文介绍了在Java Web开发中,使用Spring MVC进行参数校验的两种方法:一种是通过@RequestParam进行基本的参数检查,另一种是利用@Validated结合Java校验API进行详细的数据验证。并举例说明了@NotNull、@NotBlank、@Size等注解的用法,以及如何通过分组进行校验控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java web开发过程中,经常需要从前端获取参数到服务端,服务端预设的变量接收的值可能为正确的值,也可能是空字符串或者是null。对于变量接收的值,我们希望能够在接收值的时候进行控制,而不是在代码中处理的时候报各种奇怪的错误。

方法一:在控制层中对于接收参数添加@RequestParam

举个栗子:

@RestController
@RequestMapping("/v1")
public class HelloController {
    @GetMapping(value = {"/test_param"})
    public String testParam(@RequestParam(value = "search", required = false, defaultValue = "") String search) {
        return "Get方式请求的的参数search为:" + search;
    }
}

测试效果为:

(1)当输入search具体的参数时,能够正确的显示具体的参数


(2)当不输入search参数时,会输出空字符串,而不是null



方法二:利用springframework提供的继承Java校验API提供的校验注解@Valid的@Validated

由于@Validated是基于@Valid,因此@Valid的用法不在这里介绍。

举个栗子:

1、一个简单的POJO类UserInfo如下:

import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class UserInfo {

    @NotNull(message = "用户名不能为null")
    @Size(min = 5, max = 10, message = "用户名必须是5到10个字符")
    private String userName;

    @NotNull(message = "性别不能为null")
    private String sex;

    @NotNull(message="年龄不能为null", groups = {HelloGroup.class})
    @Max(value = 120, message = "年龄不能超过120")
    private Integer age;

    @NotBlank(message = "地址不能为空字符串或者null")
    private String address;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "userName='" + userName + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

分析:

(1)区别@NotNull和@NotBlank

@NotNull表示不能为null,如果传入的是空字符串则是合法的。而@NotBlank表示既不能为null也不能为空字符串,显然@NotBlank的用法更常见

(2)在注解中显示的写明(message=“对具体的注解进行解释的语句”)

便于在控制层校验的时候返回错误的信息(后面补充控制层的写法)

(3)@Size的用法用来控制字符串的长度

(4)注意:这里的groups={HelloGroup.class}有点类似给这个注解打了标签进行分组,HelloGroup是个接口,定义如下:

public interface HelloGroup {
}

在控制层中,显示的指定要的分组。(注意:如果没有指定任何分组,则早控制层是扣除了分组剩余的注解校验的参数)

 

2、控制层的写法如下:

配合上面的例子如下:

@RestController
@RequestMapping("/v1")
public class HelloController {
@GetMapping(value = {"/test_param"})
    public String testParam(@Validated UserInfo userInfo, BindingResult bindingResult) {
        if(bindingResult.hasErrors()) {
            StringBuffer sb = new StringBuffer();
            for(ObjectError objectError:bindingResult.getAllErrors()) {
//                sb.append(((FieldError)objectError).getField() + ":").append(objectError.getDefaultMessage());
                sb.append(objectError.getDefaultMessage()).append(" ");
            }
            return sb.toString();
        }
        return "Get方式请求的的参数userInfo为:" + userInfo.toString();
    }
}

输出的效果如下:


与切面编程结合后期待补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值