SpringMVC之参数校验注解@Valid

5 篇文章 0 订阅
2 篇文章 0 订阅

注解介绍

这里写图片描述
这里写图片描述

以上基本是所有注解了。


注解使用

  • 实体类中添加注解
@Data
public class User {
    @Range(min = 0,max = 100,message = "年龄必须在0~100之间")
    private Integer age;
    
    private String name;

    @Length(min = 8,message = "密码不能少于八位")
    private String password;
}
  • controller接收
	@PostMapping("/user")
    public int addUser(@Valid @RequestBody User user, BindingResult errors) {
        if (errors.hasErrors()){ //是否有错误
            errors.getAllErrors().stream().forEach(error -> {
                FieldError fieldError = (FieldError) error;
                String err = fieldError.getField() + " : " + fieldError.getDefaultMessage();
                System.err.println(err);
            });
            return 0;
        }
        int result = userService.insertUser(user);
        return result;
    }

必须配合@Valid才有效,BindingResult是捕获注解的异常。

  • 单元测试
@Test
    public void whenPostInfoSuccess() throws Exception {
        String content = "{\"age\":110,\"name\":\"张三\",\"password\":\"123456\"}";
        String result = mockMvc.perform(MockMvcRequestBuilders.post("/user")
                //数据格式json
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(content))
                //返回状态是否200
                .andExpect(status().isOk())
                .andReturn().getResponse().getContentAsString();
        System.out.println("============" + result);
    }

我们参数age大于100,密码个数小于8位,这时执行单元测试,打印出:

age : 年龄必须在0~100之间
password : 密码不能少于八位

注解扩展(自定义注解)

虽然上面提供很多校验的注解,但有时还是难以满足我们的需求,这时我们就需要自定义校验注解,再配合@Valid使用。

  • 自定义一个注解StringMatch ,如:字符串满足特定的值
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
//指定校验逻辑在哪个类中
@Constraint(validatedBy = StringMatchConstraintValidator.class)
public @interface StringMatch {

	String message() default "{javax.validation.constraints.NotNull.message}";

	String value() default "";

	Class<?>[] groups() default { };

	Class<? extends Payload>[] payload() default { };
}

注意:@Constraint(validatedBy = StringMatchConstraintValidator.class)是指该注解具体校验逻辑在哪个类中实现。

  • StringMatchConstraintValidator类实现ConstraintValidator接口
/**
 * 该类可直接使用@Autowired注入bean
 * MyUnique :定义的注解
 * Object:需验证字段的类型
 */
/**
 * 该类可直接使用@Autowired注入bean
 * StringMatch :定义的注解
 * String:需验证字段的类型
 */
public class StringMatchConstraintValidator implements ConstraintValidator<StringMatch, Object> {

    private String msg;
    /**
     * 注解初始化方法
     */
    @Override
    public void initialize(StringMatch constraintAnnotation) {
         msg = constraintAnnotation.value();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        return msg.equals(value);
    }
}

isValid方法是具体的实现逻辑,返回false说明有错误,返回ture说明没有错误(相当于没有注解)。
在实体类中使用


	@StringMatch(value = "XXXXXX",message = "非法操作")
	private String name;

	@StringMatch( value = "XXXXXXX",message = "非法操作")
	private String passWord;

这样一个注解就定义好了,使用方式和上面一开始一模一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值