java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java参数校验Validator与@AssertTrue

Java参数校验Validator与@AssertTrue深度解析

作者:訾博ZiBo

本文详细介绍了Java的Validator框架及其@AssertTrue注解的使用,包括环境准备、基础注解介绍、实战示例、@AssertTrue的深入解析、高级特性和最佳实践建议,感兴趣的朋友跟随小编一起看看吧

Java参数校验最佳实践:Validator与@AssertTrue深度解析

1. 引言

在企业级应用开发中,参数校验是保证数据质量的第一道防线。本文将深入介绍Java的Validator框架的使用,特别是如何结合@AssertTrue注解实现复杂的业务校验逻辑。

2. 环境准备

2.1 依赖配置

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.5.Final</version>
</dependency>

3. 基础注解介绍

常用的校验注解包括:

4. 实战示例

4.1 请求对象定义

@Data
public class ImageRequest {
    /**
     * 图片URL地址
     */
    @Pattern(regexp = "^(http|https)://.*", message = "图片URL格式不正确")
    @Size(max = 1024, message = "图片URL长度不能超过1024个字符")
    private String imageUrl;
    /**
     * Base64编码的图片数据
     */
    @Size(max = 10 * 1024 * 1024, message = "Base64图片数据不能超过10MB")
    private String base64Image;
    /**
     * 设备编号
     */
    @NotBlank(message = "设备编号不能为空")
    private String deviceNo;
    /**
     * 用户标识
     */
    @NotBlank(message = "用户标识不能为空")
    private String userId;
    /**
     * 自定义校验方法:确保至少提供一种图片数据
     */
    @AssertTrue(message = "必须提供图片URL或Base64编码图片数据其中之一")
    public boolean isImageDataValid() {
        return StringUtils.isNotBlank(imageUrl) || StringUtils.isNotBlank(base64Image);
    }
}

4.2 校验实现

public class ValidationExample {
    private final Validator validator;
    public ValidationExample() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        this.validator = factory.getValidator();
    }
    public void validateRequest(ImageRequest request) {
        // 执行校验
        Set<ConstraintViolation<ImageRequest>> violations = validator.validate(request);
        // 如果存在校验错误
        if (!violations.isEmpty()) {
            // 收集所有验证错误信息
            String errorMessage = violations.stream()
                    .map(ConstraintViolation::getMessage)
                    .collect(Collectors.joining("; "));
            log.error("参数校验失败:{}", errorMessage);
            throw new IllegalArgumentException("参数校验失败:" + errorMessage);
        }
    }
}

5. @AssertTrue深入解析

5.1 基本用法

@AssertTrue注解用于复杂的业务校验场景,特别是涉及多个字段之间的关联校验时。

5.2 命名规范

@AssertTrue(message = "校验失败的提示信息")
public boolean isXxxValid() {
    // 校验逻辑
    return true/false;
}

5.3 常见使用场景

5.3.1 互斥字段校验

@AssertTrue(message = "付款方式只能选择其中一种")
public boolean isPaymentMethodValid() {
    return (alipay != null) ^ (wechatPay != null);
}

5.3.2 依赖字段校验

@AssertTrue(message = "当选择快递配送时,收货地址不能为空")
public boolean isDeliveryAddressValid() {
    return !DeliveryType.EXPRESS.equals(deliveryType) || 
           StringUtils.isNotBlank(deliveryAddress);
}

5.3.3 数值范围联动校验

@AssertTrue(message = "结束时间必须晚于开始时间")
public boolean isTimeRangeValid() {
    return endTime != null && startTime != null && 
           endTime.after(startTime);
}

6. 高级特性

6.1 分组校验

public interface Create {}
public interface Update {}
@AssertTrue(message = "创建时的校验规则", groups = {Create.class})
public boolean isCreateValid() {
    return ...;
}
@AssertTrue(message = "更新时的校验规则", groups = {Update.class})
public boolean isUpdateValid() {
    return ...;
}

6.2 组合校验规则

@AssertTrue(message = "图片数据格式校验失败")
public boolean isImageFormatValid() {
    if (StringUtils.isNotBlank(imageUrl)) {
        return imageUrl.startsWith("http") && 
               (imageUrl.endsWith(".jpg") || imageUrl.endsWith(".png"));
    }
    if (StringUtils.isNotBlank(base64Image)) {
        return base64Image.startsWith("data:image/");
    }
    return false;
}

7. 最佳实践建议

统一异常处理

性能优化

代码规范

且具有描述性保持校验逻辑的简单清晰

测试覆盖

文档维护

到此这篇关于Java参数校验Validator与@AssertTrue深度解析的文章就介绍到这了,更多相关java参数校验Validator与@AssertTrue内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文