一 简介
介绍一种可以快速进行请求参数校验的注解,前几天前端大佬说,校验不能写代码,不能写逻辑,作为小白,我以前接触过@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类等,主要看中的还是增删改查语句,分页接口生成,可以减少重复工作,多点时间,陪陪自己的五姑娘。。。