Skip to content

@AutoValue is not compatible with validation 2.0's @Valid  #682

@findepi

Description

@findepi

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
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions