首页 > 基础资料 博客日记
java spring validation 自动、手动校验
2024-10-19 23:00:07基础资料围观76次
本篇文章分享java spring validation 自动、手动校验,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识
目录
第四步,在Contoller接口中增加参数注解@Validated
参数校验是一个常见的问题,比如字段非空,字段长度限制,邮箱格式、手机格式验证等等。
避免校验规则,写一大串步骤,繁琐重复。
Hibernate Validator为此提供了一套比较完善、便捷的验证实现方式。
一、自动校验
第一步,导入依赖
项目已经引入spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖。
项目还未引入spring-boot-starter-web包可以引入以下依赖:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
第二步,统一异常处理
ValidateExceptionController
import com.central.common.model.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
/**
* 统一异常处理
*/
@Slf4j
@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ValidateExceptionController {
//如果能精确匹配到该异常就会执行这个方法,后续执行下面的方法
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Result handelValidateException(MethodArgumentNotValidException e) {
log.error("数据校验出现问题:{},异常类型:{}", e.getMessage(), e.getClass());
Map<String, String> map = new HashMap<>();
//1.获取校验错误结果
BindingResult result = e.getBindingResult();
result.getFieldErrors().forEach(fieldError -> {
//获取每个错误的属性名字
String field = fieldError.getField();
//获取每个错误提示信息
String defaultMessage = fieldError.getDefaultMessage();
map.put(field, defaultMessage);
});
return Result.failed(map, "数据校验错误");
}
}
第三步,定义接口接收实体DTO
定义校验规则,可以参考
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
@Data
@ApiModel("售后申请接口-接收实体DTO")
public class AfterServiceApplyDTO implements Serializable {
@NotBlank(message = "订单编号不为空")
@ApiModelProperty(value = "订单编号", required = true)
private String grandsonOrderCode;
@NotNull(message = "申请售后类型不为空")
@ApiModelProperty(value = "申请售后类型: 10:退货 20:换货 30:维修", required = true)
private Integer customerExpect;
@NotBlank(message = "产品问题描述不为空")
@ApiModelProperty(value = "产品问题描述", required = true)
private String questionDesc;
@ApiModelProperty("问题描述图片链接地址,多个图片以“,”分隔")
private String questionPic;
@Valid
@NotNull(message = "客户信息实体不为空")
@ApiModelProperty("客户信息实体")
private AfterSaleCustomerDTO asCustomerDto;
@Valid
@Size(min = 1, max = 1, message = "只能申请1个商品")
@NotNull(message = "申请单明细列表不为空")
@ApiModelProperty("申请单明细列表")
private List<AfterSaleDetailDTO> asDetailDtos;
}
第四步,在Contoller接口中增加参数注解@Validated
表示只校验当前参数
@Api(tags = "【售后】订单售后API接口")
@RestController
public class AfterServiceApiController {
/**
* 售后申请接口
* @param afterServiceApplyDTO 售后申请参数
* @return 操作结果
*/
@ApiOperation("售后申请接口")
@PostMapping("/afterService/api/apply")
public Result apply(@Validated @RequestBody AfterServiceApplyDTO afterServiceApplyDTO) {
// todo
return null;
}
}
第五步,测试结果
Postman发送错误数据触发验证测试
二、手动校验
第一步,校验工具类
ValidatorUtils
import com.central.business.afterService.dto.AfterServiceApplyDTO;
import com.central.common.model.Result;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 校验工具类
*/
public class ValidatorUtils {
private static final Validator validator;
// 第一种方式创建Validator
static {
// 普通模式(默认是这个模式)
// 普通模式(会校验完所有的属性,然后返回所有的验证失败信息)
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
//第二种方式创建Validator
// static {
// // 1.普通模式(默认是这个模式)
// // 普通模式(会校验完所有的属性,然后返回所有的验证失败信息)
// // .failFast(false)
// // 或 .addProperty("hibernate.validator.fail_fast", "false")
//
// // 2.快速失败返回模式
// // 快速失败返回模式(只要有一个验证失败,则返回)
// // .addProperty("hibernate.validator.fail_fast", "true")
// // 或 .failFast(true)
// ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
// .configure()
// .failFast(true)
// .buildValidatorFactory();
// validator = validatorFactory.getValidator();
// }
/**
* 校验对象,返回校验失败List信息
*
* @param object 对象
* @param groups 组
* @return 校验失败List信息
*/
public static List<String> validateEntity(Object object, Class<?>... groups) {
List<String> list = new ArrayList<>();
Set<ConstraintViolation<Object>> validate = validator.validate(object, groups);
for (ConstraintViolation<Object> violation : validate) {
list.add(violation.getMessage());
}
return list;
}
/**
* 校验对象,返回校验失败Map信息
*
* @param object 对象
* @param groups 组
* @return 校验失败Map信息,key为属性(字段名),value为校验失败信息
*/
public static Map<String, String> validateEntityProperty(Object object, Class<?>... groups) {
Map<String, String> map = new HashMap<>();
Set<ConstraintViolation<Object>> validate = validator.validate(object, groups);
for (ConstraintViolation<Object> violation : validate) {
map.put(violation.getPropertyPath().toString(), violation.getMessage());
}
return map;
}
/**
* 校验对象,返回校验失败Result信息
*
* @param object 对象
* @param groups 组
* @return 校验失败Result,校验失败返回错误信息,成功返回成功信息
*/
public static Result<Map<String, String>> validateEntityResult(Object object, Class<?>... groups) {
Map<String, String> map = new HashMap<>();
Set<ConstraintViolation<Object>> validate = validator.validate(object, groups);
for (ConstraintViolation<Object> violation : validate) {
map.put(violation.getPropertyPath().toString(), violation.getMessage());
}
if (map.size() > 0) {
return Result.failed(map, "数据校验错误!");
}
return Result.succeed("数据校验成功!");
}
public static void main(String[] args) {
AfterServiceApplyDTO afterServiceApplyDTO = new AfterServiceApplyDTO();
System.out.println(validateEntityResult(afterServiceApplyDTO));
}
}
第二步,测试结果
Result(datas={questionDesc=产品问题描述不为空, grandsonOrderCode=供应链三级订单编号不为空, reason=售后原因不为空, asCustomerDto=客户信息实体不为空, asDetailDtos=申请单明细列表不为空, businessPlatformCode=业务商城售后申请单号不为空, customerExpect=申请售后类型不为空}, resp_code=1, resp_msg=数据校验错误!)
文章来源:https://blog.csdn.net/qq_42277412/article/details/142170572
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: