前端校验方便用户的同时,也减轻了服务器压力
但当恶意访问者绕过浏览器,通过Postman等类似工具进行访问时,前端校验未必有用,此时我们需要添加后端校验
注解介绍
Hibernate 中填充一部分
使用
引入gav坐标
<!-- 属性效验-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
目标Bean标注注解
@ToString
@Getter
@Setter
public class UmsAdminParam {
//规定长度
@Length(min = 6, max = 19, message = "用户名长度是6-18位")
@ApiModelProperty(value = "用户名", required = true)
private String username;
@ApiModelProperty(value = "密码", required = true)
private String password;
//不能是空的
@NotEmpty
@ApiModelProperty(value = "用户头像")
private String icon;
@Email(message = "邮箱格式错误")
@ApiModelProperty(value = "邮箱")
private String email;
@NotNull
@ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "备注")
private String note;
}
通知Spring这个数据需要校验
@valid:校验错误会有默认的响应
自定义错误提示
还可以给需要校验的数据后添加一个BingingResult来封装自定义错误提示
public Stringregister(@Valid @RequestBody UmsAdminParam user,BindingResult result) {
//得到所有错误信息计数
int errorCount = result.getErrorCount();
//错误数大于0
if (errorCount>0){
//得到所有错误
List<FieldError> fieldErrors = result.getFieldErrors();
//迭代错误
fieldErrors.forEach((fieldError)->{
//错误信息
String field = fieldError.getField();
log.debug("属性:{},传来的值是:{},出错的提示消息:{}",
field,fieldError.getRejectedValue(),fieldError.getDefaultMessage());
});
return fieldError.getRejectedValue()+"出错:"+fieldError.getDefaultMessage();
}else{
return "登录成功";
}
}
分组校验(多场景的复杂校验)
- @NotBlank(message=“不能为空”, groups={自己的空接口:Addgroup.clsss})给校验注解标注什么情况下需要校验
- @Validated({AddGroup.class})
- 默认没有指定分组的校验注解,在分组校验情况下(@Validated({Addgroup.class}))不生效
自定义校验
编写一个自定义的校验注解
-
创建Annotation类
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) public @interface ListValue { String message() default "{com.qhit.common.valid.ListValue.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; int[] vals() default {}; }
ValidationMssage.properties
com.qhit.common.valid.ListValue.message=必须提交指定的值
-
编写一个自定义校验器
-
关联自定义的校验器和自定义的校验注解
@Constraint(validatedBy = {ListValueValidatedBy.class/*可以指定多个校验器*/}) public @interface ListValue