java 实体类 有 validation 方法,spring boot使用Validation做实体类数据验证

需要使用到的技术有:

Swagger-UI、Java、Bean Validation。

Swagger-UI需要引入包和配置,这里就不说它的配置了,网上面很多的。

关于使用如:@NotNull之类的Java注解时,找不到类的时候,需要引入的包:

javax.validation

validation-api

1.1.0.Final

目录:

1、实体类注解

2、实体类验证分组(包含验证那些没有分组的)

3、组排序

4、验证多个对象

还有一些验证方法,需要更新,也希望大家提供,如:级联验证、对象内部对象验证,等等。

一、实体类的注解

@Data

@NoArgsConstructor

@AllArgsConstructor

public class User2 {

@ApiModelProperty(value = "密码4")

@NotNull(message = "密码4不能为空")

private String pawss4;

@ApiModelProperty(value = "密码5")

@NotNull(message = "密码5不能为空")//它属于import javax.validation.constraints.NotNull;

private String pawss5;

}

// @ApiModelProperty()用于方法,字段; 表示对model属性的说明或者数据操作更改,它属于swagger-ui

// value–字段说明

// name–重写属性名字

// dataType–重写属性类型

// required–是否必填

// example–举例说明

// hidden–隐藏

Java的注解还有:

@Null 被注释的元素必须为null

@NotNull 被注释的元素不能为null

@AssertTrue 被注释的元素必须为true

@AssertFalse 被注释的元素必须为false

@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max,min) 被注释的元素的大小必须在指定的范围内。

@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内

@Past 被注释的元素必须是一个过去的日期

@Future 被注释的元素必须是一个将来的日期

@Pattern(value) 被注释的元素必须符合指定的正则表达式。

@Email 被注释的元素必须是电子邮件地址

@Length 被注释的字符串的大小必须在指定的范围内

@NotEmpty 被注释的字符串必须非空

@Range 被注释的元素必须在合适的范围内

controller的使用:

@PostMapping("/add")

public RspMessage add(@Validated User2 user,BindingResult result){

Listlist = new ArrayList<>();

for (FieldError error:result.getFieldErrors()){

list.add(error.getDefaultMessage());

}

if (list != null && list.size() > 0){

return new RspFailMessage(list);

}

return null;

}

controller这里可以写一个全局异常,把BindingResult捕获住,就不用每个方法都写这个了,如:

package com.qw.exception;

import com.qw.utils.BindingResultUtil;

import com.qw.utils.RspFailMessage;

import com.qw.utils.RspMessage;

import org.springframework.validation.*;

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.ResponseBody;

/**

* 全局异常捕获处理

*/

@ResponseBody

@ControllerAdvice

public class GlobalExceptionHandler {

/**

* 处理 Validator 框架实体类验证的错误返回

* @return

*/

@ExceptionHandler({BindException.class})

public RspMessage BindingResult(BindingResult result){

return new RspFailMessage(BindingResultUtil.bindingResul(result));

}

}

全局异常中的那个:BindingResultUtil.bindingResul 方法,和上面controller里面的方法一样的,只是把他单独抽取出来了而已,都是解析BindingResult对象的。

使用全局异常后,controller的写法就变成了:

@PostMapping("/add")

public RspMessage add(@Validated User2 user){

return null;

}

swagger ui 显示如下:

3ccfcdf4e13de8f0dfec1045054f39fc.png

二、实体类验证分组(包含没有分组的也要验证)

有时候,我们验证实体类时,不需要验证全部,比如新增时,需要id为空,修改时,需要id不为空,那么这里就需要分组验证了。

1、先新建两个接口(可以新建多个),专门用来区分新增和修改时需要验证的实体类属性。

package com.qw.model;

import javax.validation.groups.Default;

//用于新增的分组,这个可以单独写一个包,其他实体类应用。

//继承的 Default :需要验证没有分组的属性

public interface EntityAdd extends Default {

}

package com.qw.model;

import javax.validation.groups.Default;

//用于修改的分组,这个可以单独写一个包,其他实体类应用。

//继承的 Default :需要验证没有分组的属性

public interface EntityUpdate extends Default {

}

2、实体类

package com.qw.model;

import io.swagger.annotations.ApiModelProperty;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;

@Data

@NoArgsConstructor

@AllArgsConstructor

public class User2 {

@NotNull(message = "不能为空",groups = {EntityUpdate.class})

private Long id;

@ApiModelProperty(value = "密码4")

@NotNull(message = "密码4不能为空",groups = {EntityAdd.class,EntityUpdate.class})

private String pawss4;

@ApiModelProperty(value = "密码5")

@NotNull(message = "密码5不能为空")

private String pawss5;

}

上面的实体类中,id是在修改时,才进行验证,密码4在新增和修改时都需要验证,密码5 是不进行分组。

3、controller:

@PostMapping("/add")

public RspMessage add(@Validated({EntityAdd.class}) User user){

return null;

}

三、组排序

Bean Validation 做验证时,是无序的,但在一个实体类中有多个组时,想要先验证一个组,在验证另一个组时,就需要进行组排序了。排序后:第一个组验证不通过,就不会验证下一个组了。

1、实体类

package com.qw.model;

import io.swagger.annotations.ApiModelProperty;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import javax.validation.GroupSequence;

import javax.validation.constraints.NotNull;

import javax.validation.groups.Default;

@Data

@NoArgsConstructor

@AllArgsConstructor

public class User2 {

@NotNull(message = "不能为空",groups = {EntityUpdate.class})

private Long id;

@ApiModelProperty(value = "密码4")

@NotNull(message = "密码4不能为空",groups = {EntityAdd.class,EntityUpdate.class})

private String pawss4;

@ApiModelProperty(value = "密码5")

@NotNull(message = "密码5不能为空")

private String pawss5;

//用于当前类中的属性验证顺序,先验证没有分组的,在验证新增的,这个也可以写成公共的,也可以写多个,根据实际业务需求来。

@GroupSequence({Default.class,EntityAdd.class})

public interface UserValidationSort{}

}

2、controller:

@PostMapping("/add")

public RspMessage add(@Validated({User2.UserValidationSort.class}) User2 user){

return null;

}

四、多个对象验证

1、controller

@PostMapping("/update")

public RspMessage update(@Validated({EntityUpdate.class}) User user, @Validated User2 user2){

return null;

}

直接把多个对象写上去就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值