(资料图片)

Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证如果碰到 @NotEmpty否则不生效,注意看下 @RequestBody前面是否加上了@Valid

Validation常用注解汇总
Constraint详细信息
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@NotBlank被注释的元素不能为空(空格视为空)
@NotEmpty被注释的元素不能为空 (允许有空格)
@Size(max, min)被注释的元素的大小必须在指定的范围内
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Pattern(value)被注释的元素必须符合指定的正则表达式
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为 false
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
示例
/**   * 用户名   */  @NotBlank(message = "用户名不能为空")  private String username;  /**   * 用户真实姓名   */  @NotBlank(message = "用户真实姓名不能为空")  private String name;  /**   * 密码   */  @Pattern(regexp = "^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9]))(?=^[^\\u4e00-\\u9fa5]{0,}$).{8,20}$", message = "密码过于简单有被盗风险,请保证密码大于8位,并且由大小写字母、数字,特殊符号组成")    private String password;  /**   * 邮箱   */  @NotBlank(message = "邮箱不能为空")  @Email(message = "邮箱格式不正确")  private String email;  /**   * 手机号   */  @NotBlank(message = "手机号不能为空")  @Pattern(regexp = "^(1[0-9])\\d{9}$", message = "手机号格式不正确")  private String mobile;
Demo

入参对象上,添加注解及说明

package com.vipsoft.web.entity;import javax.validation.constraints.NotBlank;import javax.validation.constraints.Size;import java.io.Serializable;/** * 定时任务调度 */public class QuartzJob implements Serializable {    private static final long serialVersionUID = 1L;    /**     * 任务序号     */    private long jobId;    /**     * 任务名称     */    @NotBlank(message = "任务名称不能为空")    @Size(max = 10, message = "任务名称不能超过10个字符")    private String jobName;    /**     * 任务组名     */    @NotBlank(message = "任务组名不能为空")    @Size(max = 10, message = "任务组名不能超过10个字符")    private String jobGroup;    /**     * 调用目标字符串     */    private String invokeTarget;    /**     * 执行表达式     */    private String cronExpression;    /**     * cron计划策略 0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行     */    private String misfirePolicy = "0";    /**     * 并发执行 0=允许,1=禁止     */    private String concurrent;    /**     * 任务状态(0正常 1暂停)     */    private String status;    /**     * 备注     */    private String remark;}

Controller @RequestBody 前面必须加上 @Valid 否则不生效

import javax.validation.Valid;@RestController@RequestMapping("schedule")public class ScheduleController {    private Logger logger = LoggerFactory.getLogger(ScheduleController.class);    @Autowired    IQuartzJobService jobService;    @RequestMapping("/add")    public ApiResult addTask(@Valid @RequestBody QuartzJob param) throws Exception {        logger.info("添加调度任务 => {} ", JSONUtil.toJsonStr(param));                return new ApiResult("添加成功");    }}

异常处理,统一返回对象,方便前端解析GlobalExceptionHandler

package com.vipsoft.web.exception;import cn.hutool.core.util.StrUtil;import com.vipsoft.web.utils.ApiResult;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.validation.BindException;import org.springframework.validation.BindingResult;import org.springframework.validation.FieldError;import org.springframework.validation.ObjectError;import org.springframework.web.HttpRequestMethodNotSupportedException;import org.springframework.web.bind.MethodArgumentNotValidException;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.List;/** * 全局异常处理器 */@RestControllerAdvicepublic class GlobalExceptionHandler {    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);     /**     * 处理自定义异常     */    @ExceptionHandler(CustomException.class)    public ApiResult handleException(CustomException e) {        // 打印异常信息        logger.error("### 异常信息:{} ###", e.getMessage());        return new ApiResult(e.getCode(), e.getMessage());    }    /**     * 参数错误异常     */    @ExceptionHandler({MethodArgumentNotValidException.class, BindException.class})    public ApiResult handleException(Exception e) {        if (e instanceof MethodArgumentNotValidException) {            MethodArgumentNotValidException validException = (MethodArgumentNotValidException) e;            BindingResult result = validException.getBindingResult();            StringBuffer errorMsg = new StringBuffer();            if (result.hasErrors()) {                List errors = result.getAllErrors();                errors.forEach(p -> {                    FieldError fieldError = (FieldError) p;                    errorMsg.append(fieldError.getDefaultMessage()).append(",");                    logger.error("### 请求参数错误:{" + fieldError.getObjectName() + "},field{" + fieldError.getField() + "},errorMessage{" + fieldError.getDefaultMessage() + "}");                });                return new ApiResult(6001, errorMsg.toString());            }        } else if (e instanceof BindException) {            BindException bindException = (BindException) e;            if (bindException.hasErrors()) {                logger.error("### 请求参数错误: {}", bindException.getAllErrors());            }        }        return new ApiResult(6001, "参数无效");    }    /**     * 处理HttpRequestMethodNotSupporte异常     * @param e     * @return     */    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)    public Object methodHandler(HttpRequestMethodNotSupportedException e) {        // 打印异常信息        logger.error("### 异常信息:{} ###", e.getMessage());        return new ApiResult(6000, e.getMessage());    }    /**     * 处理所有不可知的异常     */    @ExceptionHandler(Exception.class)    public ApiResult handleOtherException(Exception e) {        // 打印异常信息        logger.error("### 系统内部错误:{} ###", e.getMessage(), e);        String warnMsg = StrUtil.isEmpty(e.getMessage()) ? "### 系统内部错误 ###" : e.getMessage();        return new ApiResult(6000, "系统内部错误", e.getMessage());    }}

统一返回对像 ApiResult

package com.vipsoft.web.utils;//import com.github.pagehelper.PageInfo;import java.io.Serializable;public class ApiResult implements Serializable {    /**     * 返回编码 0:失败、1:成功     */    private int code;    /**     * 返回消息     */    private String message;    /**     * 返回对象     */    private Object data;    /**     * 分页对象     */    private Page page;    public ApiResult() {        this.code = 1;        this.message = "请求成功";    }    public ApiResult(Integer code, String message) {        this.code = code;        this.message = message;    }    public ApiResult(Integer code, String message, Object data) {        this.code = code;        this.message = message;        this.setData(data);    }    public ApiResult(Object data) {        this.code = 1;        this.message = "请求成功";        this.setData(data);    }//    public ApiResult(PageInfo pageInfo) {//        this.code = 1;//        this.message = "请求成功";//        this.setData(pageInfo.getList());//        this.setPage(convertToPage(pageInfo));//    }////    public Page convertToPage(PageInfo pageInfo) {//        Page result = new Page();//        result.setTotalCount(pageInfo.getTotal());//        result.setPageNum(pageInfo.getPageNum());//        result.setPageCount(pageInfo.getPages());//        result.setPageSize(pageInfo.getPageSize());//        result.setPrePage(pageInfo.getPrePage());//        result.setNextPage(pageInfo.getNextPage());//        return result;//    }    public int getCode() {        return code;    }    public void setCode(int code) {        this.code = code;    }    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }    public Object getData() {        return data;    }    public void setData(Object data) {        this.data = data;    }    public Page getPage() {        return page;    }    public void setPage(Page page) {        this.page = page;    }}

运行结果如下


关键词: