后端表单校验功能

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。后端表单校验功能,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!