BindingResult用在实体类校验信息返回结果绑定。

实体类常用的校验注解有:

@Null  被注释的元素必须为null
@NotNull  被注释的元素不能为null
@AssertTrue  该字段只能为true
@AssertFalse  该字段的值只能为false
@Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin("value")  被注释的元素必须是一个数字,验证小数的最小值
@DecimalMax("value")  被注释的元素必须是一个数字,验证小数的最大值
@Size(max,min)  查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等
@Digits(integer,fraction) 检查是否是一种数字的整数、分数,小数位数的数字
@Past  被注释的元素必须是一个过去的日期
@Future  被注释的元素必须是一个将来的日期
@Pattern(regexp = "[abc]") 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电子邮件地址
@Length(max=5,min=1,message="长度在1~5")    检查所属的字段的长度是否在min和max之间,只能用于字符串
@NotEmpty  被注释的字符串必须非空
@Range  被注释的元素必须在合适的范围内   

@CreditCardNumber 对信用卡号进行一个大致的验证

@NotBlank 不能为空,检查时会将空格忽略

@NotEmpty 不能为空,这里的空是指空字符串

以上注解在使用时,都可以设置自定义message提示信息。

举个栗子:

@ApiModel(value ="TestEntity")
public class TestEntity implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "唯一id")
	private Long id;
	
	@Size(max=10,message="最大长度为10")
	@ApiModelProperty(value = "名称")
	private String name;
	
	@NotNull(message="参数不能为空")
	@ApiModelProperty(value = "年龄")
	private Integer age;

	//getter setter...
	
}

Controller层:

public class TestController {

	@PostMapping("/a")
    @ApiOperation(value = "测试", notes = "")
	public void test(@RequestBody @Valid TestEntity test,BindingResult bindingResult) {
		System.out.println(test.toString());
		if (bindingResult.hasErrors()) {
			throw new 自定义Exception("错误提示码",bindingResult.getFieldError().getDefaultMessage());
		}
	}
}

 @Valid和BindingResult配套使用,@Valid用在参数前,BindingResult作为校验结果绑定返回,如果@Valid不起作用,换@Validated试试。

bindingResult.hasErrors()判断是否校验通过,校验未通过,bindingResult.getFieldError().getDefaultMessage()获取在TestEntity的属性设置的自定义message,如果没有设置,则返回默认值"javax.validation.constraints.XXX.message"。

-------------------------------------2022-08-05更新以下内容-----------------------------------------------------------

使用@RestControllerAdvice注解进行统一校验判断,就不用在每个方法上都写BindingResult bindingResult和异常判断。

@RestControllerAdvice
public class ControllerExceptionAdvice {

    @ExceptionHandler({BindException.class})
    public ResultVo MethodArgumentNotValidExceptionHandler(BindException e) {
        // 从异常对象中拿到ObjectError对象
        ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
        return new ResultVo(ResultCode.VALIDATE_ERROR, objectError.getDefaultMessage());
    }
}
@Getter
public enum ResultCode implements StatusCode{
    SUCCESS(1000, "请求成功"),
    FAILED(1001, "请求失败"),
    VALIDATE_ERROR(1002, "参数校验失败"),
    RESPONSE_PACK_ERROR(1003, "response返回包装失败");

    private int code;
    private String msg;

    ResultCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}
@Data
public class ResultVo {
    // 状态码
    private int code;

    // 状态信息
    private String msg;

    // 返回对象
    private Object data;

    // 手动设置返回vo
    public ResultVo(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    // 默认返回成功状态码,数据对象
    public ResultVo(Object data) {
        this.code = ResultCode.SUCCESS.getCode();
        this.msg = ResultCode.SUCCESS.getMsg();
        this.data = data;
    }

    // 返回指定状态码,数据对象
    public ResultVo(StatusCode statusCode, Object data) {
        this.code = statusCode.getCode();
        this.msg = statusCode.getMsg();
        this.data = data;
    }

    // 只返回状态码
    public ResultVo(StatusCode statusCode) {
        this.code = statusCode.getCode();
        this.msg = statusCode.getMsg();
        this.data = null;
    }
}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐