我使用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版本
答案 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)。