版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29451823/article/details/82696294
- Spring boot 自带的valida验证
post方法为例
/**
* 接受json,@RequestBody将其反序列化为pojo对象
* @RequestBody 是写在方法参数前,作用于方法参数
* @ResponseBody 是写在方法上,作用于方法返回值
* 其中BindingResult必须与valid的前提下,才有效果
* @param user
* @param errors
* @return
*/
@PostMapping
public User create(@Valid @RequestBody User user , BindingResult errors) {
//判断是否为空
if(errors.hasErrors()) {
//打印可能出现的错误
errors.getAllErrors().stream().forEach(error -> System.out.println(error.getDefaultMessage()));
}
System.out.println(user.getId());
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getDate());
user.setId(1);
return user;
}
**对应的User类的验证提示Message信息需放在Get方法或者字段上,一下部分User代码
**
public class User {
public interface UserSimpleView {};
public interface UserDetailView extends UserSimpleView {};
@MyConstraint(message = "属性校验")
private String username;
private Integer id;
@NotBlank(message = "密码不能为空") // 此注解需要@valid,不然没有效果
private String password;
private Date date;
@JsonView(UserSimpleView.class)//指定返回那些字段属性
public String getUsername() {
return username;
}
}
浏览器输入http://localhost:8060/user sts控制台打印如下
**复杂的时间验证**
更新用例
/**
* 更新
* @param user
* @param errors
* @return
*/
@PutMapping("/{id:\\d+}")
public User update(@Valid @RequestBody User user , BindingResult errors) {
//判断是否为空
if(errors.hasErrors()) {
//打印可能出现的错误
errors.getAllErrors().stream().forEach(error -> {
FieldError fieldError = (FieldError)error;
String errorName = fieldError.getField();
String errorMessage = fieldError.getDefaultMessage();
System.out.println(errorName + " " + errorMessage);
});
}
System.out.println(user.getId());
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getDate());
user.setId(1);
return user;
**User属性对应的字段上**
@Past(message="时间必须是过去")
public Date getDate() {
return date;
}
时间验证测试用例
@Test
public void whenUpdateSuccess() throws Exception {
//取一年以后的时间
Date date = new Date(LocalDateTime.now().plusYears(1).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println(date.getTime());
String content = "{\"id\":\"1\",\"username\":\"tom\",\"password\":null,\"date\":"+date.getTime()+"}";
String result = mockMvc.perform(put("/user/1").contentType(MediaType.APPLICATION_JSON_UTF8)
.content(content))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(1))
.andReturn().getResponse().getContentAsString();
System.out.println(result);
}
测试结果
- 自定义注解验证
注解类
/**
*
* @author caijiajun
* @date 2018年9月4日
*/
@Target({ElementType.METHOD,ElementType.FIELD})//表明注解标注的位置
@Retention(RetentionPolicy.RUNTIME)//运行时注解
@Constraint(validatedBy = MyConstraintValidator.class)//用于校验的类
public @interface MyConstraint {
String message() default "错误";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
异常处理MyConstraintValidator类
/**
* @author caijiajun
* @date 2018年9月4日
*/
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> {
@Override
public void initialize(MyConstraint arg0) {
System.out.println("初始化校验器");
}
@Override
public boolean isValid(Object arg0, ConstraintValidatorContext arg1) {
//这里面写具体的验证逻辑
System.out.println("进入校验");
return false;//代表验证不通过,将打印message信息,如果为true,则代表通过,BindingResult返回结果中没有message信息
}
}
User属性字段或者get方法调用刚才配置的注解
@MyConstraint(message = "属性校验")
private String username;
测试打印结果