使用自定义注释在构造期间验证记录组件值

问题描述 投票:0回答:0

我尝试使用自定义注释来验证记录的组件,以便在值无效时创建新记录对象失败。

使用 Micronaut v3.8.6 和 Java 19(激活预览功能),定义了密封接口

@Introspected
public sealed interface UserId {
    record Identifier(@Positive long value) implements UserId {}
    record MailAddress(@EMail String value) implements UserId {}
}

使用这个注解

@Target({PARAMETER, RECORD_COMPONENT, TYPE_USE, CONSTRUCTOR, FIELD, METHOD, ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
public @interface EMail {

    String message() default "is not a valid email address: ({validatedValue})";
}

与工厂整合

@Factory
public class AppConfig {
    @Singleton
    public ConstraintValidator<EMail, String> eMailStringConstraintValidator() {
        return (value, annotationMetadata, context) -> EMailAddressConstraints.isValid(value);
    }
}

其中

isValid
方法只返回一个布尔值但不会抛出异常。

创建新的 MailAddress 对象时永远不会调用验证器。为了确保它基本上可以正常工作,我注释了控制器方法的一个参数。传递无效的字符串如预期的那样失败。

为什么创建记录时注解会被忽略?顺便说一句,我试图让它与显式声明带有注释参数的规范构造函数一起工作......

java record micronaut
© www.soinside.com 2019 - 2024. All rights reserved.