自创建问题以来已超过 2 年,但无论如何我都会回复,因为如果他们在自定义注释中遇到类似行为,它仍然可以帮助某人。在使用自定义注释和不可变对象时,我遇到了类似的问题。
类定义:
@Value.Immutable
@JsonDeserialize(as = ImmutableMyClass.class)
public abstract class MyClass {
@MyCustomAnnotation
public abstract String getMyField();
...
生成的不可变类(注意添加了“java.lang.”前缀):
@Immutable
@CheckReturnValue
public final class ImmutableMyClass extends MyClass {
private final java.lang.@MyCustomAnnotation String myField;
...
自定义注解定义:
@Documented
@Target({FIELD, PARAMETER, ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomAnnotationValidator.class)
public @interface MyCustomAnnotation {
String DEFAULT_MESSAGE = "Validation message...";
...
这导致根本不触发“MyCustomAnnotation”。
我的问题是在“MyCustomAnnotation”中缺少 ElementType.METHOD(因为我使用的是抽象方法 getter)。
@Documented
@Target({FIELD, **METHOD**, PARAMETER, ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomAnnotationValidator.class)
public @interface MyCustomAnnotation {
String DEFAULT_MESSAGE = "Validation message...";
...
添加 ElementType.METHOD 后,问题消失了,验证按预期触发。
生成的不可变类:
@Immutable
@CheckReturnValue
public final class ImmutableMyClass extends MyClass {
private final @MyCustomAnnotation String myField;
...
对于其他情况(例如,当正确使用注释的 ElementType 时,我会建议升级到最新的可能版本的依赖项(目前为 Immutables 的 2.8.2)。