杰客网络

杰客网络个人博客

spring boot 自定义Validator注解

Java 0 评

https://www.cnblogs.com/sanboshi/p/9378666.html

各注解使用

https://www.cnblogs.com/wjh123/p/8745473.html

自定义验证

http://daobin.wang/2017/06/Spring-Validation/

参数实体添加注解:
/**

  • 月结算单生成请求参数 实体
  • @author lhj
  • @version 1.0.0
  • @date 2020/09/05

*/
public class IssueRequestParams {


/** 结算日期(yyyymm) */
@Size(message="结算日期:必须输入项目且必须是年月(YYYYMM)格式{max}个字符长度", max=6, min=6)
private String asDate;

/** 核算日期(yyyymm) */
@Size(message="核算日期:必须输入项目且必须是年月(YYYYMM)格式{max}个字符长度", max=6, min=6)
private String acDate;

/** 付款方智能账户id */
@NotEmpty(message = "付款方智能账户id")
@NotNull(message = "付款方智能账户id")
private String pAccountId;

/** 付款方智能账户名 */
@NotEmpty(message = "付款方智能账户名")
@NotNull(message = "付款方智能账户名")
private String pAccountName;

/** 付款方银行卡号 */
@NotEmpty(message = "付款方银行卡号")
@NotNull(message = "付款方银行卡号")
private String pBkaccAccno;

/** 付款方是否招行(默认:Y Y:招行 , N:非招行) */
@NotNull(message = "付款方是否招行")
@NotEmpty(message = "付款方是否招行")
private String pBnkFlg;

/** 智能账户ID */
@NotBlank(message="智能账户ID")
private String accountId;

/** 账户姓名 */
private String accountName;

@NotNull(message="项目ID")
@Min(message="项目ID:必须参数,且大于等于{value}", value=1)
private int projectId;

/** 结算状态(默认 0 0.未对账 1.对账中 2.已对账 3.结算中 4.已结算) */
@Range(message="结算状态:必须参数,且大于等于{min}小于等于{max}", min=1, max=4)
private byte state;

/** 分账日期(yyyymm) */
@NotBlank(message="分账日期")
@Size(message="分账日期必须是年月格式{max}个字符长度", max=6, min=6)
private String acdate;


/** 用途 */
private String nusage;

/** 请求账单其他金额列表 */
@Valid // 这个注解说明,对这个列表中的也要进行验证。
private List<ACSettlementMonth> list;

// 省略
}

导入包:
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

依赖(Sringboot依赖,已经包含验证包):

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>

请求写法:
@PostMapping("/api/v1/ac_settlement/issue")
public Result issueSettlementMonth(@Validated @RequestBody IssueRequestParams params, BindingResult bindingResult) {

进行验证:
// 参数验证
@SuppressWarnings("unchecked")
Result check = (Result) validParams(bindingResult);

if (null != check) {

return check;

}

共通方法:
/**

  • 参数验证
  • 没有错误时返回 null
  • @param bindingResult
  • @return

*/
protected Result<?> validParams(BindingResult bindingResult) {


if (bindingResult.hasErrors()) {
    FieldError fieldError = bindingResult.getFieldError();
    return processBindingError(fieldError);
}

return null;

}

/**

  • 返回信息格式化
  • 根据注解自定义返回信息和错误码
  • @param fieldError
  • @return

*/
private Result<?> processBindingError(FieldError fieldError) {

Result<?> result = new Result<Object>();

String code = fieldError.getCode();
LOGGER.debug("validator error code: {}", code);

switch (code) {
    case "NotEmpty":
        result.setCode(ValidataEnum.NOT_EMPTY.getCode());
        result.setMessage(fieldError.getDefaultMessage() + ":" + ValidataEnum.NOT_EMPTY.getMsg());
        return result;
    case "NotNull":
    case "NotBlank":
        result.setCode(ValidataEnum.NOT_NULL.getCode());
        result.setMessage(fieldError.getDefaultMessage() + ":" + ValidataEnum.NOT_NULL.getMsg());
        return result;
    case "Min":
    case "Max":
    case "Size":
        result.setCode(ValidataEnum.MAX_MIN.getCode());
        result.setMessage(fieldError.getDefaultMessage() + ":" + ValidataEnum.MAX_MIN.getMsg());
        return result;     
    default:
        result.setCode(ValidataEnum.UN_DEFINE.getCode());
        result.setMessage(fieldError.getDefaultMessage() + ":" + ValidataEnum.UN_DEFINE.getMsg());
        return result;
}

}

自定义错误信息枚举类:
/**

  • 请求参数验证错误信息枚举类
  • @author lhj
  • @version 1.0.0
  • @date 2020/09/03

*/
public enum ValidataEnum {


NOT_NULL("必须参数,必须传递,不能为NULL", -1001),
NOT_EMPTY("必须参数,不能为空", -1002),
MAX_MIN("", -1003),
SIZE("", -1004),
UN_DEFINE("未定义错误信息,请定义。", -9999),
;

private String msg;
private int code;

private ValidataEnum(String argMsg, int argCode) {
    this.msg = argMsg;
    this.code = argCode;
}

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg = msg;
}

public int getCode() {
    return code;
}

public void setCode(int code) {
    this.code = code;
}

}

错误示例:
{

"code": -1001,
"message": "智能账户ID:必须参数,必须传递,不能为NULL",
"data": null

}

MySql 使用注意事项