微信开放平台与个人网站怎么/上海培训机构整顿
开发中,通常操作逻辑都是先进性数据校验,校验完毕以后才进行真正的逻辑处理。通常情况下,可以使用javax.validation校验注解,类似于AOP面向切面的实现数据的校验。在springboot中引入spring-boot-starter-web依赖,就会自动引入hibernate-validator。如图:

内置注解
使用javax.validation校验参数,一般在controller层,对方法参数进行校验。常用的注解包括:@NotNull,值不能为空,@Positive,数字为正数,@Size,字符串大小限制。示例:
/*** @Author iloveoverfly**/@Data
public class UserAddDto implements Serializable {private static final long serialVersionUID = -6630904002198113779L;@NotEmpty(message = "用户名称为空")private String username;@NotNull(message = "用户的类型为空")private Integer category;
}
扩展注解
在系统中,会根据业务新增不同的校验逻辑,例如,电话号码的校验,数字类型枚举值校验,数据id的有效性校验等等。示例,定义注解@EffectivePhone进行电话号码校验,EffectivePhone注解定义如下:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(EffectivePhone.List.class)
@Documented
@Constraint(validatedBy = {EffectivePhoneConstraint.class}
)public @interface EffectivePhone {
String message() default "{javax.validation.constraints.EffectivePhone.message}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface List {EffectivePhone[] value();}
}
定义 EffectivePhoneConstraint实现电话号码的校验,代码如下:
@Slf4j
public class EffectivePhoneConstraint implements ConstraintValidator<EffectivePhone, String> {@Overridepublic boolean isValid(String phone, ConstraintValidatorContext constraintValidatorContext) {if (StringUtils.isBlank(phone)) {return false;}return PhoneUtil.isPhone(phone);}
}
使用该校验逻辑的示例如下:
@Datapublic class UserAddDto implements Serializable {private static final long serialVersionUID = -6630904002198113779L;@EffectivePhone(message = "无效的电话号码")private String phoneNumber;}
@Validated与@Valid使用
Validated和Valid都可以实现参数校验。Validated能够对参数校验可以进行分组,用于根据不同的分组生效指定的校验逻辑。定义ValidateGroup,用于却分不同校验的分组,UserAddOrUpdateDto,用于用户新增或者修改的共同参数,代码如下:
// 校验规则的分组public class ValidateGroup {/*** 新增分组*/public interface Add {}/*** 修改操作分组*/public interface Update {}
}// 用户新增或者修改的参数部分规则@Datapublic class UserAddOrUpdateDto implements Serializable {private static final long serialVersionUID = -3968061262394340781L;@NotNull(message = "id为空", groups = {ValidateGroup.Update.class})private Long id;@NotEmpty(message = "名称为空", groups = {ValidateGroup.Add.class, ValidateGroup.Update.class})private String name;
}
// 用户新增和修改api@RestController
@RequestMapping("/users")
@Slf4jpublic class UserController {@Autowiredprivate IUserManager userManager;// 用户新增@PostMapping("/add")public Response addUser(@Validated(ValidateGroup.Add.class) @RequestBody UserAddOrUpdateDto userAddDto) {return Response.success(this.userManager.addUser(userAddDto));}// 用户修改@PutMapping("/update")public Response updateUser(@Validated(ValidateGroup.Update.class) @RequestBody UserAddOrUpdateDto userUpdateDto) {return Response.success(userManager.userUpdateDto(userUpdateDto));}
}
Valid用于生效包含类参数的校验逻辑,示例,用户参数中的权限校验参数中,权限编码不能为空。代码如下:
// 用户新增或者修改的参数部分规则@Datapublic class UserAddOrUpdateDto implements Serializable {private static final long serialVersionUID = -3968061262394340781L;@NotNull(message = "id为空", groups = {ValidateGroup.Update.class})private Long id;@NotEmpty(message = "名称为空", groups = {ValidateGroup.Add.class, ValidateGroup.Update.class})private String name;// 权限校验字段生效@Validprivate List<PermissionDto> permissions;// 用户拥有权限@Datapublic final class PermissionDto implements Serializable {private static final long serialVersionUID = 9057606562562888975L;private Long id;private String name;@NotEmpty(message = "权限编码为空")private String code;}
}