spring字段注解校验,spring自定义注解进行参数检查
00-1010一、环境准备二。常见验证注释和示例。验证方法中的常用参数。验证方法中的自定义对象五、@Valid和@Validated VI的区别。分组验证七。用户定义的验证注释
00-1010将以下依赖项添加到项目中
完整版
org . hibernate : hibernate-validator :5 . 3 . 5 . final maven
依赖性groupIdorg.hibernate/groupId artifact id Hibernate-Validator/artifact id version5.3.5.Final/version/dependency如果是SpringBoot项目,只需要引入web starter,里面包含了所需的依赖性。
目录
公共类userdo {///不显示地址公共接口CommonView {} //显示地址公共接口admin view extensions common view { } @ JSON view(value=common view . class)私有字符串username@ JSON view(value=admin view . class)私有字符串地址;//GeterSetter.}//此参数必须为空@Null(message=“不需要ID”)私有整数ID;//根据正则性@ pattern (regexp= d {11} $ ,message=手机格式不正确,不是11位数)检查手机号码是否由数字组成私串电话;//检查对象是否为null //对于String,空字符串可以通过检查,所以String要用@NotBlank检查。这只是一个例子。@NotNull(message= contact不能为空)私有字符串friendName//检查对象是否为空对象,可用于数组、集合、map、string @ not empty(message= family members不能为空)私有列表族;//检查长度,可用于数组,集合,map,string @ size (min=4,max=8,message=错误用户名按大小)//检查长度,只能用于string @ length (min=4,max=8,message=错误用户名按长度)私有字符串用户名;//javax check @Max(value=200,message=年龄一般不大于200 by max) @ min (value=1,message=年龄一般不小于1 by min) //hibernate check,效果同@Range(min=0,Max=200,message=年龄范围为0-200 byrange )私有整数;//检查参数是否为False,反之,@ assert true @ assert False(message=用户初始化不需要冻结)私有布尔锁;//String dedicated @ not blank(message=密码不能为空)@Size(min=6,max=12,message=密码长度有误)私有字符串密码;//使用自定义验证注释-验证时间@过去(message=生日只能在前一时间)@ JSON格式(pattern= yyyy-mm-ddhh3360mm )私信日期出生;//验证Email @Email的私有字符串Email(message=不正确的邮箱地址);
00-1010将@Validated添加到类中
>注解
在参数上加上校验注解
以controller层作示例如下:
@Validated@RestController@RequestMapping(value = "/user")public class UserController { /** * 校验请求参数 */ @GetMapping public String getUser(@Size(min = 5, max = 8, message = "用户名长度超出限制") String username) { return username; }}
四、校验类方法中的自定义对象
在类上加@Validated
注解(同普通参数一样都需要加)
在参数上加@Valid
,(或者加@Validated也是可以的)
@Validated@RestController@RequestMapping(value = "/user")public class UserController { /** * 校验请求中的自定义对象 */ @PostMapping public UserDTO saveUserOuter(@RequestBody @Valid UserDTO userDTO) { return userDTO; }}
3.在自定义对象中的属性上加上校验注解
public class UserDTO { //该参数必须为空 @Null(message = "无需ID") private Integer id; //根据正则校验手机号是否是由数字组成 @Pattern(regexp = "^\d{11}$", message = "手机格式不正确,不是11位") private String telephone; //校验该对象是否为null //对于String来说,空字符串可通过校验,所以String应该使用@NotBlank进行校验,此处仅做示例而已。 @NotNull(message = "联系人不能为空") private String friendName; //校验对象是否是空对象,可用于Array,Collection,Map,String @NotEmpty(message = "家庭成员不能为空") private List families; //校验长度,可以用于Array,Collection,Map,String @Size(min = 4, max = 8, message = "用户名长度错误 by size") //校验长度,只能用于String @Length(min = 4, max = 8, message = "用户名长度错误 by length") private String username; //javax校验 @Max(value = 200, message = "年龄一般不会超过200 by max") @Min(value = 1, message = "年龄一般不能小于1 by min") //hibernate校验,效果等同 @Range(min = 0, max = 200, message = "年龄范围在0-200之间 by range") private Integer age; //校验参数是否是False, 相反的是@AssertTrue @AssertFalse(message = "用户初始化无需冻结") private Boolean lock; //String专用 @NotBlank(message = "密码不能为空") @Size(min = 6, max = 12, message = "密码长度不对") private String password; //使用自定义校验注解->校验时间 @Past(message = "生日只能为以前的时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private Date birth; //校验Email @Email(message = "邮件地址不正确") private String email;//setter getter ....}
五、关于@Valid和@Validated的区别联系
一直对@Valid和@Validated这两个注解非常疑惑,不知道怎么区分和使用。
1.包位置
@Valid: javax.validation, 是javax,也是就是jsr303中定义的规范注解
@Validated: org.springframework.validation.annotation, 是spring自己封装的注解。
2.功能@Valid就不用说了,是jsr303的规范。我们打开@Validated的源码,可以看到以下注释,
Variant of JSR-303s {@link javax.validation.Valid}, supporting thespecification of validation groups. Designed for convenient use withSprings JSR-303 support but not JSR-303 specific.
大致意思就是说@Validated是@Valid的一个变种,扩展了@Valid的功能,支持group分组校验的写法。那么我们对于@Valid和@Validated就可以这么理解:
能用@Valid的地方通常可以用@Validated替代。需要使用分组校验的时候使用@Validated注解。
六、分组校验
我们有一个用户DTO,其中有id,username两个属性。当保存时,id不需要有值,由数据库自动生成,我们使用@Null注解校验。当更新时,id需要有值,根据ID去更新用户名,我们使用@NotNull注解校验。无论是保存用户还是更新用户,都需要校验用户名,我们使用@NotBlank注解校验。
UserGroupValidDTO
public class UserGroupValidDTO { public interface SaveGroup extends Default {} public interface UpdateGroup extends Default {} @Null(groups = {SaveGroup.class}, message = "不需要传入用户ID") @NotNull(groups = {UpdateGroup.class}, message = "用户ID不能为空") private Integer id; @NotBlank(message = "用户名不能为空") private String username; //Setter Getter ...}
定义相应类型的公开接口(SaveGroup,UpdateGroup),给每个校验注解指定groups属性,如果不指定则默认为javax.validation.groups.Default.class。
我们让SaveGroup和UpdateGroup继承了Default, 那么三个接口之间的关系类似如下:
save --> SaveGroup -->id @Null -->Default --> username @NotBlank update--> UpdateGroup -->id @NotNull -->Default --> username @NotBlank
UserController
@Validated@RestController@RequestMapping(value = "/user")public class UserController { /** * 分组校验:保存用户,不能传ID */ @PostMapping("/save") public void validSaveUser(@RequestBody @Validated(value = UserGroupValidDTO.SaveGroup.class) UserGroupValidDTO userDTO) { //save user } /** * 分组校验:更新用户信息,需要传ID */ @PostMapping("/update") public void validUpdateUser(@RequestBody @Validated(value = UserGroupValidDTO.UpdateGroup.class) UserGroupValidDTO userDTO) { //update user }}
在方法参数的对象上加@Validated属性,填写Value为对应的接口的class即可,这时候访问不同的接口就会进行不同的校验了。
七、自定义校验注解
有时候默认提供的校验注解无法满足我们的需要,我们需要自定义。例如现有校验注解不支持java8中的LocalDateTime。那么接下来我们自定义一个校验LocalDateTime的注解。该注解判断传入的时间是否是一个过去的时间。
1.创建校验注解
/** * @author kingboy--KingBoyWorld@163.com * @date 2017/12/29 下午7:24 * @desc ${DESCRIPTION}. */@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = PastTimeValidate.class)public @interface PastDate { String message(); Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { };}
2.编写校验规则
校验规则也就是枚举PastDate中指定的validateBy属性
/** * @author kingboy--KingBoyWorld@163.com * @date 2017/12/29 下午7:28 * @desc . */@CommonsLogpublic class PastTimeValidate implements ConstraintValidator<PastDate, LocalDateTime> { @Override public void initialize(PastDate constraintAnnotation) { log.info("init enum PastDate"); } @Override public boolean isValid(LocalDateTime localDateTime, ConstraintValidatorContext context) { return localDateTime.isBefore(LocalDateTime.now()) ? true : false; }}
写完这些,我们就可以像@Past对Date校验一样使用@PastDate对LocalDateTime进行校验了。
以上就是SpringMVC中常用参数校验类注解使用示例教程的详细内容,更多关于SpringMVC中参数校验注解示例的资料请关注盛行IT其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。