SpringMvc参数校验
Spring中提供了一系列用于参数校验的注解
基础使用
在实体类具体的字段上添加对应的校验注解和,错误信息即可
注:使用前一定要记得添加hibernate的依赖
- 在实体类中添加上校验注解
package com.sy.dto;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.Past;
import java.util.Date;
/**
* @author 沈洋 邮箱:1845973183@qq.com
* @create 2021/5/6-14:00
**/
@Data
public class User {
private String id;
@NotBlank(message = "用户名不能为空")
private String username;
@NotBlank(message = "密码不能为空")
private String password;
@Past(message = "时间不符")
private Date birthday;
}
- 还需要在接口处的参数添加@Valid注解才可以生效(没有在参数处加@Valid注解时,参数校验不会生效)
package com.imooc.web.controller;
import com.fasterxml.jackson.annotation.JsonView;
import com.imooc.dto.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
/**
* @author 沈洋 邮箱:1845973183@qq.com
* @create 2021/5/5-10:51
**/
@RestController
public class UserController {
@PutMapping("/user/{id}")
public String update(@PathVariable("id")String id,@Valid @RequestBody User user, BindingResult errors){
//使用参数校验后,如果参数校验检查出有错的参数,BindingResult对象中会携带对应的信息
//message中的信息就是在字段中填写的message
if (errors.hasErrors()) {
errors.getAllErrors().stream().forEach(error->{
FieldError fieldError = (FieldError) error;
String message = fieldError.getField()+":"+error.getDefaultMessage();
System.out.println(message);
});
return "参数无效,修改失败";
}
System.out.println(user);
return "用户信息修改成功";
}
}
常用注解(Hibernate Validator)
注解名称 | 效果 |
---|---|
@NotNull | 值不能为空 |
@Null | 值必须为空 |
@Pattern(regex="") | 字符串必须匹配正则表达式 |
@Size(min=,max=) | 集合的元素数量必须在min和max之间 |
字符串必须是Email地址 | |
@Length(min=,max=) | 检查字符串的长度 |
@NotBlank | 字符串必须有字符 |
@NotEmpty | 字符串不为null,集合有元素 |
@Range(min=,max=) | 数字必须大于等于min,小于等于max |
@SafeHtml | 字符串是安全的html |
@URL | 字符串是合法的URL |
@AssertFalse | 值必须是false |
@AssertTrue | 值必须是true |
@DecimalMax(value=,inclusive=) | 值必须小于等于(inclusive=true)/小于(inclusive=false)value属性是指定值,可以注解在字符串类型的属性上 |
@DecimalMin(value=,inclusive=) | 值必须大于等于(inclusive=true)/大于(inclusive=false)value属性是指定值,可以注解在字符串类型的属性上 |
@Digits(integer=,fraction=) | 数字格式检查.Integer指定整数部分的最大长度,fraction指定小数部分的最大长度 |
@Future | 值必须是未来的日期 |
@Past | 值必须是过去的日期 |
@Max(value=) | 值必须大于等于value指定的值,不能注解在字符串上 |
@Max(value=) | 值必须大于等于value指定的值,不能注解在字符串上 |
自定义参数校验
自定义注解接口
package com.imooc.validator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author 沈洋 邮箱:1845973183@qq.com
* @create 2021/5/6-18:52
**/
//target表示注解在什么上面使用
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
//这个注解表示,自定义的注解属于参数校验接口
//validateBy对应的参数就是具体的实现类
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
//下面三个属性是Valid注解必须有的
//message注解可以有默认值,根据自己需要填写
String message();
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
注解实现类
package com.imooc.validator;
import com.imooc.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* @author 沈洋 邮箱:1845973183@qq.com
* @create 2021/5/6-18:57
**/
/**
* 实现了ConstraintValidator的类会被自动spring注入
不需要加@Compnet注解
自定义参数校验的最大好处是,可以在参数校验的时候注入你需要的东西进行操作
*/
public class MyConstraintValidator implements ConstraintValidator<MyConstraint,Object> {
/**
* 自定义校验规则的好处就是可以在类中注入spring中的bean就行操作
* @param constraintAnnotation
*/
//可以按照你的需求注入需要的bean
@Autowired
private HelloService helloService;
/**
*initialize方法会在校验器第一次被加载时执行,
*可以进行一些校验器的初始化操作
*/
@Override
public void initialize(MyConstraint constraintAnnotation) {
System.out.println("my validator 初始化");
}
/**
*isvalud方法是校验的主题,具体的校验规则就是在这里写
*value对应的就是校验时的参数
*返回true代表校验成功,返回false代表校验失败
*/
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
helloService.greeting("sy");
return false;
}
}
Service
package com.imooc.service;
/**
* @author 沈洋 邮箱:1845973183@qq.com
* @create 2021/5/6-19:00
**/
public interface HelloService {
String greeting(String name);
}
package com.imooc.service.impl;
import com.imooc.service.HelloService;
import org.springframework.stereotype.Service;
/**
* @author 沈洋 邮箱:1845973183@qq.com
* @create 2021/5/6-19:01
**/
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String greeting(String name) {
System.out.println("Greeting "+name);
return "hello"+name;
}
}