我尝试使用自定义注释来验证记录的组件,以便在值无效时创建新记录对象失败。
使用 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 对象时永远不会调用验证器。为了确保它基本上可以正常工作,我注释了控制器方法的一个参数。传递无效的字符串如预期的那样失败。
为什么创建记录时注解会被忽略?顺便说一句,我试图让它与显式声明带有注释参数的规范构造函数一起工作......