返回

Spring Boot 升级后测试用例故障:UUID 验证疑难全解

java

升级 Spring Boot 后测试用例故障:UUID 验证疑难解答

简介

在升级 Spring Boot 版本到 3.2.3 后,许多开发人员遇到了测试用例故障,特别是涉及 UUID 验证的情况。此问题源于 @Pattern 注解在验证 UUID 时的变化,本文将探讨其背后的原因并提供解决方案。

问题:@Pattern 不再支持 UUID 验证

@Pattern 注解是验证字符串是否符合给定正则表达式的常用注解。在 Spring Boot 3.2.3 及更早版本中,该注解可用于验证 UUID。然而,在 3.2.3 中,@Pattern 不再支持 UUID 验证,导致了测试用例故障。

原因:Jakarta Bean Validation API 的更新

造成此问题的原因是 Jakarta Bean Validation API 的更新。该 API 的最新版本引入了新的约束验证机制,从而使 @Pattern 不再支持 UUID 验证。

解决方案:使用自定义验证注解

为了解决此问题,我们需要使用自定义验证注解来验证 UUID。我们可以创建一个新的注解并使用 @Valid 注解进行递归验证。

创建自定义 UUID 验证注解

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Constraint(validatedBy = UUIDValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface UUID {
    String message() default "Invalid UUID";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

创建 UUID 验证器

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

public class UUIDValidator implements ConstraintValidator<UUID, String> {
    private static final String UUID_REGEX = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

public class UUIDValidator implements ConstraintValidator<UUID, String> {
    private static final String UUID_REGEX = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$";

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return Pattern.matches(UUID_REGEX, value);
    }
}
quot;
; @Override public boolean isValid(String value, ConstraintValidatorContext context) { return Pattern.matches(UUID_REGEX, value); } }

使用自定义注解和 @Valid

@PostMapping("/users/{id}")
public User update(@Valid @PathVariable("id") UUID id, @RequestBody User user) {
    // ...
}

结论

通过使用自定义验证注解并将其与 @Valid 一起使用,我们可以解决 Spring Boot 3.2.3 中 UUID 验证的故障问题。此方法既能保持 @PathVariable 的便利性,又能确保 UUID 的有效性。

常见问题解答

1. 为什么 @Pattern 不再支持 UUID 验证?

Jakarta Bean Validation API 的更新引入了新的约束验证机制,从而使 @Pattern 不再支持 UUID 验证。

2. 为什么使用自定义注解而不是直接修改 @Pattern

Spring Framework 强烈建议不要修改内置注解。使用自定义注解允许我们扩展验证规则并将其用于未来版本。

3. 是否可以创建其他自定义注解来验证其他数据类型?

是的,我们可以创建自定义注解来验证任何数据类型,包括日期、时间、电子邮件地址和其他复杂对象。

4. 我需要为每个数据类型创建单独的注解吗?

不一定。我们可以使用通用验证注解并使用属性来指定要验证的数据类型。

5. 自定义验证注解有什么好处?

自定义验证注解提供了更大的灵活性,允许我们创建满足特定验证需求的自定义规则。它们还可以提高代码的可维护性和可读性。