一 简介

介绍一种可以快速进行请求参数校验的注解,前几天前端大佬说,校验不能写代码,不能写逻辑,作为小白,我以前接触过@vaild这个注解,但是hibermate框架用这个比较多。SPringBoot—MyBatis多半都是前端校验非必要和必要两种参数,后端校验必要参数,会集中切面去校验,@vaild就是运用的AOP切面抽离,统一校验的方式,实现方法很简单,很快捷。

二 实现过程-三个部分

运用主体技术:SpringBoot,MyBatis,Swagger2。。。

第一部分

Model(POJO) 类

import io.swagger.annotations.ApiModel;
import lombok.Data;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

@Data
@ApiModel(description = "设备控制")
public class DeviceControl {
    @NotNull(message = "用户ID不能为空")
    @Range(min = 1, max = 1000000000, message = "用户ID必须大于1")
    private int userId;
    @NotNull(message = "分组ID不能为空")
    @Range(min = 1, max = 1000000000, message = "分组ID必须大于1")
    private int groupId;
    @NotEmpty(message = "设备ID不能为空")
    private String deviceId;
    @NotEmpty(message = "命令名称不能为空")
    private String  command;
    @NotEmpty(message = "命令执行参数不能为空")
    private String commandParameter;
}

注意 通过捕获不同的异常信息去返回给前端

第二部分

Controller (控制层)

 @RequestMapping(value = "/DeviceControl", method = RequestMethod.POST)
    @ResponseBody
    @ApiOperation(value = "设备控制")
    public Ba***monResult DeviceControl(@Valid @RequestBody DeviceControl control) {
        log.info("DeviceController-DeviceControl:" + control.toString());
        return (service.DeviceControl(control));
    }

第三部分

切面编程-全局异常捕获

import com.nkr.ndp.domain.bo.Ba***monResult;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


import java.util.List;

import static com.nkr.ndp.utils.ResultCodeType.PARAMETER_ERROR;

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public Ba***monResult MyExceptionHandle(MethodArgumentNotValidException exception){
        BindingResult result = exception.getBindingResult();
        StringBuilder errorMsg = new StringBuilder() ;
        if (result.hasErrors()) {
            List<FieldError> fieldErrors = result.getFieldErrors();
            fieldErrors.forEach(error -> {
                errorMsg.append(error.getDefaultMessage()).append(";");
            });

        }
        return new Ba***monResult(PARAMETER_ERROR,errorMsg.toString(),"");
    }
}

注意 别倒错jar包了,不然让你生不如死

补充返回类构造

/**
 * 通用结果信息类 基类
 *
 * @author xuxiaogang
 * @date 2019-11-26
 */
@Data
@AllArgsConstructor
@ApiModel(description = "通用返回结果实体")
public class Ba***monResult {
    private Integer code;
    private String message;
    private Object data;

    public Ba***monResult() {
        code = 0;
        message = "调用成功";
        data = "";
    }

    public Ba***monResult(Object data) {
        code = 0;
        message = "调用成功";
        this.data = data;
    }


    public Ba***monResult(String msg) {
        code = 0;
        message = msg;
        this.data = "";
    }
    public Ba***monResult(Object data,String msg) {
        code = 0;
        message = msg;
        this.data = data;
    }
}

这是自己用的返回类,你也可以自己构造。

三 总结

目前我还在完善全局异常信息捕捉,由于之前只是了解,并没有正儿八经用过这东西。这东西可以加快代码构建,我比较追求便捷,能不敲代码就不敲代码。如果有经常使用的Mybatis框架的,可以用一下Free MyBatis plugin 这个插件,类似EasyCode这个插件,前提你是使用IDEA这个开发工具的,如果是Eclipse,我暂时还不知道怎么使用,这两个插件是自动生成DAO,Service,Model以及对应DAO的XML文件语句的,对于简单构造可以是使用,自动生成接口,实现类,dao层,daoXML实现,POJO类等,主要看中的还是增删改查语句,分页接口生成,可以减少重复工作,多点时间,陪陪自己的五姑娘。。。