3、spring boot + Maven + Restful 默认注解valida验证和自定义注解valida验证

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;

测试打印结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_29451823/article/details/82696294