注释从Immutables接口奇怪地传递到实现

时间:2017-09-29 14:00:41

标签: java bean-validation hibernate-validator annotation-processing immutables-library

我使用Immutables为此接口生成不可变的内容:

import javax.validation.constraints.Size;
...

@Value.Immutable
public interface Entity {
    @Size(max = 10) // removing this also works
    String name();
} 

但是生成的类字段对我来说看起来很奇怪:

private final java.lang.@Size(max = 10) String name;

请参阅java.lang.注释前面的@Size垃圾。 有了它 - 验证不能按预期工作。

手动删除 - 一切正常。 这种行为可能是什么原因? 检查2.5.4-2.5.6版本

1 个答案:

答案 0 :(得分:0)

自创建问题以来已有2年多的时间了,但是无论如何我都会做出答复,因为如果有人在使用自定义批注时遇到类似的行为,它仍然可以帮助他们。 使用自定义批注和Immutables时遇到了类似的问题。

类定义:

@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时,我建议升级到最新的依赖版本(此刻不可变对象为2.8.2)。