4

我正在使用 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 版本

4

1 回答 1

0

自创建问题以来已超过 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)。

于 2020-01-16T10:32:33.267 回答