1.前言
相信各位小伙伴在实际的项目开发过程中迫于业务逻辑经常需要写很多if else来进行判断。
这样经常会使开发工作变得繁琐,并且在希望保留记录的情况下需要写大量注释文档。
即使这样,对后期的维护工作也不是非常友好。
本人就曾经被一个1400行的if else折磨的不要不要的!
策略模式可以解决很多这样的问题,但并不适用于全部情况。比如对实体类参数的校验。
本文记录一些参数校验方法,默认各位对spring-boot比较了解。不了解可忽略spring部分。
2.普通方法中对实体类的校验
import lombok.Data;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.constraints.*;
import java.util.Set;
@Data
public class Group{
public interface add{}
public interface update{}
private Integer id;
@NotBlank(message = "名称不可为空白", groups = {add.class, update.class})
private String name;
@Size(min = 5, groups = add.class)
private String info;
@Min(value = 10, groups = update.class)
private Integer count;
public static void main(String[] args) {
Group g = new Group();
g.setInfo("111");
g.setCount(5);
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Group1>> validate = validator.validate(g, add.class);
for (ConstraintViolation<Group1> c : validate) {
System.out.println(c.getMessage());
}
}
}
代码可直接运行
其中接口add/update用于区分校验分组,无其它实际意义
2.spring service impl方法中对实体类的校验
@Service
public class GroupServiceImpl implements GroupService {
@Resource
private ValidatorFactory validatorFactory;
@Override
public void addGroup(Group group) {
Set<ConstraintViolation<Group>> validate = validatorFactory.getValidator().validate(group, Group.add.class);
for (ConstraintViolation<Group> c : validate) {
System.out.println(c.getMessage());
}
System.out.println(group.toString());
}
}
代码直接使用2中的实体类忽略校验以外的逻辑和业务
3.spring-boot controller对实体类的校验
pom中引入下面依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
@RestController
@RequestMapping(value = "/group")
public class GroupController {
@PostMapping(value = "/add")
public String add(@RequestBody @Validated(Group.add.class) Group g, BindingResult result) {
if (result.hasErrors()) {
for (ObjectError oe : result.getAllErrors()) {
System.out.println(oe.getDefaultMessage());
}
}
System.out.println(g);
}
}
4.附上一些可供参考的链接
自定义校验、嵌套校验
https://blog.csdn.net/weixin_35977449/article/details/112142912
常用注解
https://blog.csdn.net/weixin_43874301/article/details/102604869
自定义校验
https://blog.csdn.net/justry_deng/article/details/86571671
中文文档
https://docs.jboss.org/hibernate/validator/4.2/reference/zh-CN/html_single/