-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Closed
Description
Same as #288 but for Validation 2.0 (javax.validation:validation-api:2.0.1.Final
) annotation.
Consider class:
@AutoValue
public abstract class MyClass
{
@Valid
@AutoValue.CopyAnnotations(exclude = Valid.class) // this is ineffective
public abstract Optional<@NotEmpty String> getFoo();
public static MyClass create(Optional<String> newFoo)
{
return new AutoValue_MyClass(newFoo);
}
}
@CopyAnnotations
works for validation 1.0 annotation but does not work for validation 2.0 (javax.validation:validation-api:2.0.1.Final
).
There:
@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
public @interface Valid {
}
@CopyAnnotations
javadoc says that TYPE_USE
annotations are copied regardless:
@Generated("com.google.auto.value.processor.AutoValueProcessor")
final class AutoValue_MyClass extends MyClass {
...
@Override
public @Valid Optional<String> getFoo() {
return foo;
}
....
This breaks validation (using Apache BVal):
javax.validation.ConstraintDeclarationException: Multiple method return values marked @Valid in hierarchy [Meta.ForMethod(public abstract java.util.Optional com.example.MyClass.getFoo()), Meta.ForMethod(public java.util.Optional com.example.AutoValue_MyClass.getFoo())]
at org.apache.bval.jsr.metadata.Liskov.noRedeclarationOfReturnValueCascading(Liskov.java:172)
at org.apache.bval.jsr.metadata.Liskov.validateContainerHierarchy(Liskov.java:118)
at org.apache.bval.jsr.metadata.HierarchyBuilder$ForContainer.<init>(HierarchyBuilder.java:302)
at org.apache.bval.jsr.metadata.HierarchyBuilder.forContainer(HierarchyBuilder.java:372)
at org.apache.bval.jsr.metadata.CompositeBuilder$ForExecutable.getReturnValue(CompositeBuilder.java:204)
at org.apache.bval.jsr.descriptor.MetadataReader$ForExecutable.getReturnValueDescriptor(MetadataReader.java:367)
at org.apache.bval.jsr.descriptor.ExecutableD.<init>(ExecutableD.java:43)
at org.apache.bval.jsr.descriptor.MethodD.<init>(MethodD.java:32)
at org.apache.bval.jsr.descriptor.MetadataReader$ForBean.lambda$getMethods$6(MetadataReader.java:190)
at java.util.HashMap.forEach(HashMap.java:1289)
at org.apache.bval.jsr.descriptor.MetadataReader$ForBean.getMethods(MetadataReader.java:186)
at org.apache.bval.jsr.descriptor.BeanD.<init>(BeanD.java:56)
at org.apache.bval.jsr.descriptor.DescriptorManager.getBeanDescriptor(DescriptorManager.java:81)
at org.apache.bval.jsr.job.ValidationJob.getBeanDescriptor(ValidationJob.java:577)
at org.apache.bval.jsr.job.ValidationJob.access$200(ValidationJob.java:81)
at org.apache.bval.jsr.job.ValidationJob$BeanFrame.<init>(ValidationJob.java:246)
at org.apache.bval.jsr.job.ValidationJob$BeanFrame.<init>(ValidationJob.java:242)
at org.apache.bval.jsr.job.ValidateBean.computeBaseFrame(ValidateBean.java:40)
at org.apache.bval.jsr.job.ValidationJob.getResults(ValidationJob.java:555)
at org.apache.bval.jsr.ValidatorImpl.validate(ValidatorImpl.java:53)
Expected behavior
com.google.auto.value.AutoValue.CopyAnnotations#exclude
should be honored, so that user remains in control of the annotations output in the generated class.
Metadata
Metadata
Assignees
Labels
No labels