点击返回目录
对于springBoot来说(严格来说,是对于springmvc来说),如果类路径里存在了Bean验证,那么LocalValidatorFactoryBean将会被登记为用于@Vaild 和@Validated验证参数。
也就是说,我们不需要去配置其他的Validator,spring以及为我们配置了LocalValidatorFactoryBean。
但如果你想配置其他的Validator则需要这样做:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public Validator getValidator(); {
// ...
}
}
什么是bean验证?
Spring对于JSR-303和JSR349的说明:https://docs.spring.io/spring/docs/5.2.0.M1/spring-framework-reference/core.html#validation-beanvalidation-overview
beanvalidation的官网:https://beanvalidation.org这里有更多的详情。
至于如何使用,看下面的示例代码:
import javax.validation.constraints.NotNull;
import org.springframework.validation.annotation.Validated;
@Validated
@RestController
public class ValidController {
@RequestMapping("/v")
public String v1(@NotNull Integer userid){
return "验证";
}
}
如上述代码所示:如果想直接验证参数是否为null。那么需要在前面添加@NotNull注解。但是此时是无效的,你还需要在类上添加@Validated注解。(该注解不是添加到方法上,也不是添加到参数上,而是添加到类上)
这个如果错误会报错:javax.validation.ConstraintViolationException:
如果是多个参数,需要用一个对象来接收呢?
我们先建一个Vo类:如下只有userid和username
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;public class UserVo {
@NotNull(message="userid不能为空",groups=First.class)
@NotNull(message="userid不能为空",groups=Three.class)
@NotNull(message="userid不能为空",groups=Sencend.class)
@Min(message="userid不能小于{value}",value=20,groups=Sencend.class)
private Integer userid;
@NotBlank(message="username不能为空",groups =Sencend.class)
@NotBlank(message="username不能为空",groups=Default.class)
private String username;
getter...setter..
}
然后是controller类
@RequestMapping("/vv")
public String vv(@Validated(Sencend.class) UserVo vo){
return "验证验证";
}
这两个结合起来就是验证userid不能为空,且不能小于20,username不能blank.
这个如果错误会报错:org.springframework.validation.BindException
你需要怎么验证在于你选择的组也就是方法参数的@Validated的值。
组类实际上需要你自行创建,而且必须是interface,它没有实际意义,只是用来标明组。
如果@Validated没有值,那么就意味着选择了Default组,Default是javax包下本身就有的。如下:
@RequestMapping("/vv")
public String vv(@Validated UserVo vo){
return "验证验证";
}
验证注解的message值通常用于提取记录,或者返回到前台。
它同样可以插入模板,例如@Min有个叫做“value"的属性,代表着最小值。那么你可以在message里插入{value}。
当无法经过验证时,spring实际上会报错。spring有默认的处理错误机制,它会将错误一股脑弄到页面上并打印栈,如果你想自行处理注解的message值则需要了解如何springboot来处理异常。