1、程序内直接校验
参数进入控制层方法,使用具体的参数方法来验证,灵活不优雅
Objects.isNull()
String.isEmpty()
2、验证 单对象(Obj)使用 @Validated
优雅,不灵活,对象类配置多
首先在对象类中
1、校验属性添加注解
2、添加校验分组
/**
* @NotBlank 非nll 非空
*/
@NotBlank(message = "name不能为空", groups = {InsertGroup.class})
private String name;
/**
* @NotNull 非空,这里是数组,不能要求非空字符串
*/
@Transient
@NotNull(message = "Ids不能为空", groups = {InsertGroup.class})
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String[] Ids;
/**
* 设置不同分组,供给不同的严正要求
*/
public interface InsertGroup {}
控制层使用@Validated验证
/**
* @Validated(OamUpg.InsertGroup.class) 这具体验证分组
*/
public AjaxResult insertTest(@Validated(TestObj.InsertGroup.class) @RequestBody TestObj obj)
经过这样设置就能在控制层对单对象的入参进行验参了
3、验证 数组对象(List)使用 @Validated+自定义工具类
首先确保单对象验证正确
Java对象
@Data
@TableName(value = "product")
@Validated
public class TheCommodity {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField(value = "product_name")
@NotBlank(message = "productName cannot be empty!",groups = {addOne.class})
private String productName;
@TableField(value = "product_count")
@NotBlank(message = "productCount cannot be empty!",groups = {addOne.class})
private String productCount;
@JsonProperty("tenant_id") // 显式指定 JSON 字段名为 tenant_id
@TableField(value = "tenant_id")
@NotNull(message = "Tenant ID cannot be null!",groups = {addOne.class})
private Integer tenantId;
public interface addOne{}
}
控制层
@PostMapping("/addOne")
public boolean addOne(@Validated(TheCommodity.addOne.class) @RequestBody TheCommodity product) {
System.out.println("入参为 "+product.toString());
return productService.save(product);
}
这个示例和2相同,通过@Validated 以及对象内部的判定注解,即可实现单对象的参数校验
现在自定义一个工具方法
import javax.validation.*;
import java.util.List;
import java.util.Set;
public class ValidationUtil {
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
/**
* 校验列表中的每个对象,并返回第一个校验失败的对象及错误信息
*
* @param list 待校验的对象列表
* @param group 校验分组
* @param <T> 对象类型
* @return 校验失败的对象字符串和错误信息,或 "200" 表示通过
*/
public static <T> String validateList(List<T> list, Class<?> group) {
for (T item : list) {
// 校验该对象
Set<ConstraintViolation<T>> violations = validator.validate(item, group);
// 如果校验失败,返回该对象的字符串打印和错误提示
if (!violations.isEmpty()) {
StringBuilder errorMessages = new StringBuilder();
for (ConstraintViolation<T> violation : violations) {
errorMessages.append(violation.getMessage()).append(", ");
}
// 返回对象的字符串打印和错误信息
return "对象: " + item.toString() + " 错误: " + errorMessages.toString();
}
}
return "200"; // 如果没有错误,返回 "200"
}
}
批量操作时调用这个方法,通过向工具类传参,
1、入参list
2、验参分组
ValidationUtil.validateList(productList, TheCommodity.addOne.class);
控制层使用示例
@PostMapping("/addBatch")
public boolean addBatch(@RequestBody List<TheCommodity> productList) {
// 调用通用工具方法进行校验
String result = ValidationUtil.validateList(productList, TheCommodity.addOne.class);
if (!result.equals("200")) {
// 验参未通过,信息提示、记录等逻辑
System.out.println(result);
return false;
}
// 继续进行逻辑操作
return true;
}
PS:这里我看了很多博客说使用@Valid 能递归到数组内,但是我各种尝试,始终没能验参成功。
所以这里暂时只能自己动手了,欢迎小伙伴们在评论区交流学习,指正错误。