1.使用validation框架, SpringBoot依赖环境
<!--后端表单校验,使用框架依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.使用validation框架, SSM依赖环境, 只需依赖这个一个包
3.以admin.java为例
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("base_admin")
public class Admin extends BaseEntity {
/**
* 管理员名称
*/
//,groups = {AddGroup.class} 分组校验 必须添加 不添加不分组 不校验
@NotBlank(message = "输入姓名不能为空",groups = {AddGroup.class, UpdateGroup.class}) //判断的是null ,"" ," "三个值
private String adminName;
/**
* 管理员昵称
*/
private String nickName;
/**
* 管理员性别 0 : 男 1:女 2: 表示未知
*/
@NotNull(message = "性别必须传递")
@SexList(sex = {0, 1},message = "你输入的必须是0,1",groups = {AddGroup.class,UpdateGroup.class})
private Integer gender;
/**
* 管理员手机
*/
@NotBlank(message = "输入手机不能为空",groups = {AddGroup.class,UpdateGroup.class})
@Pattern(regexp = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$", message = "手机号格式错误")
private String adminPhone;
}
4.在controller中需要crud方法中使用
4.1.单独使用
//单独方式
public AxiosResult update(@Validated(UpdateGroup.class) @RequestBody Admin Admin, BindingResult bindingResult) {
//后台,以下可以进行表单验证
HashMap<String, String> map = new HashMap<>();
if (bindingResult.hasFieldErrors()){
List<FieldError> fieldError = bindingResult.getFieldErrors();
fieldError.forEach(fieldError1 -> {
map.put(fieldError1.getField(),fieldError1.getDefaultMessage());
});
return AxiosResult.error(map);
}
return toAxios(adminService.updateAdminAndRoles(Admin));
}
4.2.全局异常处理方式
//使用全局异常处理方式 ,@Validated(UpdateGroup.class)表示:分组校验
public AxiosResult update(@Validated(UpdateGroup.class) @RequestBody Admin Admin) {
//要修改本身 还要修改角色
//return toAxios(adminService.update(Admin));
return toAxios(adminService.updateAdminAndRoles(Admin));
}
4.2.1.1.AddGroup.java
/**
* 分组校验 添加和修改 解决id 时候为空问题
*/
public interface AddGroup {
}
4.2.1.2.UpdateGroup.java
public interface UpdateGroup {
}
4.2.1.2.MyExceptionHandler.java
/*全局异常处理*/
@RestControllerAdvice
public class MyExceptionHandler {
/**
* 专门处理表单校验不成功的情况
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public AxiosResult<Map<String, String>> handler(MethodArgumentNotValidException e) {
Map<String, String> map = new HashMap<>();
BindingResult bindingResult = e.getBindingResult();
if (bindingResult.hasFieldErrors()) {
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for (int i = 0; i < fieldErrors.size(); i++) {
map.put(fieldErrors.get(i).getField(), fieldErrors.get(i).getDefaultMessage());
}
}
return AxiosResult.error(EnumStatus.FROM_VALICATOR_ERROR,map);
}
}
4.2.2.1.SexList.java 自定义校验方法,对sex只能输入0或1进行校验
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {SexConstraintValidator.class})
public @interface SexList {
String message() default "{javax.validation.constraints.NotNull.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
//定义数组 描述可取值的内容
int[] sex() default {};
}
4.2.2.2.SexConstraintValidator.java
/**
* 校验器
*/
public class SexConstraintValidator implements ConstraintValidator<SexList,Integer> {
List<Integer> list;
//初始化时候 执行
@Override
public void initialize(SexList constraintAnnotation) {
//拿到了 我们在代码中指定的 0,1, 如果代码指定4,5,6拿到就是456,代码中指定的啥拿到是啥
int[] sex = constraintAnnotation.sex();
list = CollectionUtils.arrayToList(sex);
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
//value 表示前端传过来的数据 返回值 是boolean
return list.contains(value);
}
}
4.2.2.3.EnumStatus.java 枚举类
public enum EnumStatus {
OK(20000,"操作成功"),
ERROR(40000,"操作失败"),
NO_LOGIN(40005,"未登录"),
ACCOUNT_ERROR(40006,"用户名错误"),
CODE_ERROR(40007,"验证码错误"),
PWD_ERROR(40007,"密码错误"),
CODE_LOSE(40008,"验证码失效"),
NO_ACTIVE(40009,"用户邮箱未激活"),
NO_PREM(40010,"无权限"),
FROM_VALICATOR_ERROR(40020,"表单校验失败");
private int status;
private String message;
EnumStatus(int status, String message) {
this.status = status;
this.message = message;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
4.2.2.4.AxiosResult.java 封装统一返回值 工具类
package com.shangma.cn.common.http;
import com.fasterxml.jackson.annotation.JsonInclude;
/*表示这个类 在转json格式字符串是,如果属性有null,则json字符串中不会有这个属性 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public class AxiosResult<T> {
private int status;
private String message;
private T data;
private static <T> AxiosResult<T> getAxiosResult(EnumStatus enumStatus, T data){
return new AxiosResult<T>(enumStatus,data);
}
public static <T> AxiosResult<T> error(EnumStatus enumStatus) {
return getAxiosResult(enumStatus, null);
}
public static <T> AxiosResult<T> error(EnumStatus enumStatus,T data) {
return getAxiosResult(enumStatus, data);
}
public AxiosResult(EnumStatus enumStatus, T data){
this.message=enumStatus.getMessage();
this.status=enumStatus.getStatus();
this.data=data;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
/**
* 返回成功的方法
*/
public static <T> AxiosResult<T> success(){
return getAxiosResult(EnumStatus.OK,null);
}
public static <T> AxiosResult<T> success(T data){
return getAxiosResult(EnumStatus.OK,data);
}
/**
* 返回失败的方法
*/
public static <T> AxiosResult<T> error(T data){
return getAxiosResult(EnumStatus.ERROR,data);
}
public static <T> AxiosResult<T> error(){
return getAxiosResult(EnumStatus.ERROR,null);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/192891.html