Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空、整数值的范围、字符串的长度、日期、邮箱等等。Spring支持JSR-303 Bean Validation API,可以方便的进行校验。
使用注解进行校验
先定义一个form的封装对象
class RequestForm {
@Size(min = 1, max = 5) private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
其中name这个字段用Size注解限制长度1到5。Size是javax.validation包中的constraint注解。
在使用时用@Valid注解表示要校验这个bean。
@ResponseBody @GetMapping(value = "bean") public String validate(@Valid RequestForm request) {
System.out.println(request.getName());
return "OK";
}
自定义注解
如果内置的注解不够用,可以自定义注解。
比如先定义一个注解NameConstraint,限制name字段只能从特定数据中选取。
@Target({
ElementType.FIELD, ElementType.PARAMETER }
)@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = NameConstraintValidator.class)@interface NameConstraint {
String[] allowedValues();
Class<?>[] groups() default {
}
;
Class<? extends Payload>[] payload() default {
}
;
String message();
}
其中allowedValues表示合法的取值范围,message是校验失败的显示信息。
message、groups、payload是hibernate validator要求的字段,想了解的请看官方文档
再定义一个validator做真正的校验
class NameConstraintValidator implements ConstraintValidator<NameConstraint, String> {
private String[] validValues;
@Override public void initialize(NameConstraint constraintAnnotation) {
validValues = constraintAnnotation.allowedValues();
}
@Override public boolean isValid(String value, ConstraintValidatorContext context) {
for (String s : this.validValues) {
if (s.equals(value)) {
return true;
}
}
return false;
}
}
在form bean中按如下方式使用
class RequestFormWithCustomConstraint {
@NameConstraint(allowedValues = {
"bar", "foo" }
, message = "只允许bar,foo") private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
直接校验参数
只有一个name字段,不想封装一个对象怎么办?可以直接校验该参数
@Controller@Validated@RequestMapping(value = "validator")public class ParameterValidatorDemoController {
@ResponseBody @GetMapping(value = "simple") public String validateParameter(@Size(min = 1, max = 5) String name) {
System.out.println(name);
return "OK";
}
}
controller上面的@Validated注解则告诉spring需要扫描这个类,来检查其中的constraint注解。
详细信息可以参考官方文档有关章节
https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-validation
https://docs.spring.io/spring/docs/4.3.16.RELEASE/spring-framework-reference/htmlsingle/#validation-beanvalidation
代码在github
https://github.com/kabike/spring-boot-demo
总结
以上所述是小编给大家介绍的Spring boot进行参数校验的方法实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
您可能感兴趣的文章:
- 详解如何在Spring Boot项目使用参数校验
- Spring Boot实现通用的接口参数校验