1. 常用的校验注解
//空检查
@NotNull 对象不为null
@NotBlank 字符串不为null且不是”“
@NotEmpty 集合不为null且不为空
//长度检查
# javax.validation.constraints.Size 包下的
@Size(min = 1, max = 10) 字符串长度 ;集合大小
@Length 字符串长度 (这个对字符串不好使)
//数值检查
@Min(1)
@Max(10)
@Range(min = 1, max = 10)
//其他
@Email
@AssertTrue
@AssertFalse
1.
@NotNull(message = "不能为空")
@DecimalMin(value = "0.01",message = "红包金额必须大于或等于0.01")
@DecimalMax(value = "10000" ,message = "红包金额必须小于或等于10000")
private String totalMoney;
1. java 内置的判空功能(list. add(null) 是不报错的的,size 为1,但是 get(0).getName() 会报空指针)
源码:
public static <T> T requireNonNull(T obj, String message) {
if (obj == null)
throw new NullPointerException(message);
return obj;
}
1. springboot 嵌套校验
校验框架:
<!--校验框架-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.3.Final</version>
<scope>test</scope>
</dependency>
实体类里的校验注解 就是这个包下的
package com.example.demo.entity;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;
import javax.validation.Valid;
import java.util.List;
/**
* @program: springboot_01
* @description:
* @author: guoyiguang
* @create: 2021-01-14 14:43
**/
@Data
public class User {
private Integer id;
@NotBlank(message = "用户 name 非空")
private String name;
@Range(min = 0, max = 1, message = "性别选择错误")
private Integer sex;
/**
* @Valid 可以用来 校验属性(和@validated 的主要区别),必须加这个,否则进不了 Order 里的 属性值校验
*/
@Valid
@NotEmpty(message = "orderList 非空")
private List<Order> orderList;
}
package com.example.demo.entity;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import java.time.LocalDateTime;
/**
* @program: springboot_01
* @description:
* @author: guoyiguang
* @create: 2021-01-14 14:43
**/
@Data
public class Order {
private Integer id;
@NotBlank(message= "orderGUID 非空")
private String orderGUID;
private String name;
private String description;
/**
* 以下属性测试mybatis插件
*/
private String createdGUID;
private String updatedGUID;
private LocalDateTime createdTime;
private LocalDateTime updatedTime;
private String delFlag;
}
Controller:
package com.example.demo.controller;
import com.example.demo.entity.Order;
import com.example.demo.entity.User;
import com.example.demo.service.CommodityOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.Valid;
import java.util.List;
/**
* @program: springboot_01
* @description:
* @author: guoyiguang
* @create: 2021-01-16 13:16
**/
@Controller
@RequestMapping("/aa")
public class TestController {
@Autowired
CommodityOrderService commodityOrderService ;
@PostMapping("/a")
@ResponseBody
public String a(@Valid @RequestBody User user , BindingResult br){
if (br.hasErrors()){
List<ObjectError> allErrors = br.getAllErrors();
ObjectError objectError = allErrors.get(0);
System.out.println(objectError.getDefaultMessage());
System.out.println(objectError.getObjectName());
System.out.println(allErrors);
return objectError.getDefaultMessage() ;
}
return "成功";
}
@PostMapping("/b")
@ResponseBody
public String b(@Valid @RequestBody List<Order> orderList , BindingResult br){
if (br.hasErrors()){
List<ObjectError> allErrors = br.getAllErrors();
ObjectError objectError = allErrors.get(0);
System.out.println(objectError.getDefaultMessage());
System.out.println(objectError.getObjectName());
System.out.println(allErrors);
return "失败" ;
}
return "成功";
}
}
PostMan 传参:
{
"name" : "慕容皝" ,
// orderList 这个属性名称和 所在实体类的 属性名称必须一致的,否则数据填充不进去
"orderList" : [
{
"orderGUID":"1367017420497834031"
},
{
"orderGUID":1367017420502028376
}
]
}
orderList 不传:
orderGUID 为空
orderGUID 不传:
接下来测试:
@PostMapping("/b")
@ResponseBody
public String b(@Valid @RequestBody List<Order> orderList , BindingResult br){
if (br.hasErrors()){
List<ObjectError> allErrors = br.getAllErrors();
ObjectError objectError = allErrors.get(0);
System.out.println(objectError.getDefaultMessage());
System.out.println(objectError.getObjectName());
System.out.println(allErrors);
return objectError.getDefaultMessage() ;
}
return "成功";
}
所以暂时不推荐 controller 的 b 方法
1. 实体类的 Integer 类型如果前段 传 "",会自动将 "" 转为 null
@RequestMapping("/nulltest1")
@ResponseBody
public String nulltest(String id){
// postMan 传 "" ,后台会接受 ""
System.out.println(id);
return id;
}
@PostMapping("/nulltest2")
@ResponseBody
public Integer nulltest2(@RequestBody Boy boy){
// sex 在 Boy 是 Integer 类型
// postMan 传 {"sex":""} 打印 null
// postMan 传 {"sex":1} 打印 1
System.out.println(boy.getSex());
return boy.getSex();
}