数据校验:
输入验证是最重要的 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,则递归验证其值元素 | 无 |
属性(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() {
}
}
点击测试运行:
点击接口测试一下内容:
完成!今天就介绍到这里,亲测!