Springboot细节挖掘(对web的支持之数据校验)

本文介绍在SpringBoot中使用HibernateValidator进行数据校验的方法,包括常见注解如@Length、@Max、@Min等的应用,以及如何在控制器中处理校验错误。

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

数据校验:

输入验证是最重要的 Web 开发任务之一,在 Spring MVC 中有两种方式可以验证输入:一种是 Spring 自带的验证框架,另外一种是利用 JSR 实现。

JSR 是一个规范文档,指定了一整套 API,通过标注给对象属性添加约束。Hibernate Validator 就是 JSR 规范的具体实现,Hibernate Validator 提供了 JSR 规范中所有内置约束注解的实现,以及一些附加的约束注解,除此之外用户还可以自定义约束注解。

Spring Boot 的参数校验依赖于 hibernate-validator 来进行。使用 Hibernate Validator 校验数据,需要定义一个接收的数据模型,使用注解的形式描述字段校验的规则,我们以 User 对象为例为大家演示如何使用。

 

Hibernate Validator 基本上包含了常用的数据校验,包括校验属性是否为空、长度、大小、特定格式等,完整的注解可以看下表:

注解应用目标运行时检查Hibernate 元数据影响
@Length(min=, max=)属性(String)检查字符串长度是否符合范围列长度会被设到最大值
@Max(value=)属性(以 numeric 或者 string 类型来表示一个数字)检查值是否小于或等于最大值对列增加一个检查约束
@Min(value=)属性(以 numeric 或者 string 类型来表示一个数字)检查值是否大于或等于最小值对列增加一个检查约束
@NotNull属性检查值是否非空(not null)列不为空
@Past属性(date 或 calendar)检查日期是否是过去时对列增加一个检查约束
@Future属性(date 或 calendar)检查日期是否是将来时
@Pattern(regex="regexp", flag=)属性(string)检查属性是否与给定匹配标志的正则表达式相匹配(见java.util.regex.Pattern )
@Range(min=, max=)属性(以 numeric 或者 string 类型来表示一个数字)检查值是否在最小和最大值之间(包括临界值)对列增加一个检查约束
@Size(min=, max=)属性(array,collection,map)检查元素大小是否在最小和最大值之间(包括临界值)
@AssertFalse属性检查方法的演算结果是否为 false(对以代码方式而不是注解表示的约束很有用)
@AssertTrue属性检查方法的演算结果是否为 true(对以代码方式而不是注解表示的约束很有用)
@Valid属性(object)对关联对象递归进行验证。如果对象是集合或数组,就递归地验证其元素;如果对象是 Map,则递归验证其值元素
@Email属性(String)检查字符串是否符合有效的 email 地址规范

我们单独写一个单元测试和接口测试的demo,检测一下:

cotroller:

package com.sharejdbc.test.cotroller;

import com.sharejdbc.test.model.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;

/**
 * @authorseerhuitao 用户控制
 * @create2019/6/5
 */
@RestController
public class UserCotroller {
    @RequestMapping(value="/saveUser")
    public List<String> saveUser(@Valid User user, BindingResult result){
        System.out.println("user:"+user);
        List<String> index=new ArrayList<>();
           if(result.hasErrors()){
               List<ObjectError> list=result.getAllErrors();
               for(ObjectError oe:list){
                   System.out.println(oe.getCode()+"---------"+oe.getDefaultMessage());
                   index.add(oe.getDefaultMessage());
               }
           }
        return index;
    }


}

 User类:

package com.sharejdbc.test.model;

import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;

/**
 * @authorseerhuitao 用户描述
 * @create2019/6/5
 */
public class User {
    @NotEmpty(message="姓名不能为空")
    private String name;
    @Max(value = 100, message = "年龄不能大于100岁")
    @Min(value= 18 ,message= "必须年满18岁!" )
    private int age;
    @NotEmpty(message="密码不能为空")
    @Length(min=6,message="密码长度不能小于6位")
    private String pass;
    //...

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", pass='" + pass + '\'' +
                '}';
    }
}

ApplicationTest代码:

package com.sharejdbc.test;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ShareJdbcApplicationTests {
	@Autowired
	private WebApplicationContext wac;

	private MockMvc mockMvc;
	@Before
	public void setup() {
		mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
	}
	@Test
	public void saveUsers() throws Exception {
		mockMvc.perform(MockMvcRequestBuilders.post("/saveUser")
				.param("name","")
				.param("age","666")
				.param("pass","test")
		);

	}

	@Test
	public void contextLoads() {
	}

}

点击测试运行:

 

点击接口测试一下内容:

完成!今天就介绍到这里,亲测!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值