You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@avro.apache.org by "JavierSA (via GitHub)" <gi...@apache.org> on 2025/11/14 16:49:05 UTC

Re: [PR] AVRO-4053: doc consistency in velocity templates [avro]

JavierSA commented on PR #3150:
URL: https://github.com/apache/avro/pull/3150#issuecomment-3533670838

   Hi, @opwvhk, @martin-g and @RyanSkraba:
   
   I updated Avro from 1.12.0 to 1.12.1 and found and issue when executing the goal `schema` of avro-maven-plugin: Java classes (.java) generated from Avro schemas (.avsc) miss some annotations declared in `"javaAnnotation"` properties.
   
   AFAIK, the problem comes from the changes of this PR because `SpecificCompiler` validates annotations now ([`javaAnnotations()`](https://github.com/apache/avro/blob/release-1.12.1/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java#L1038) calls the new method [`isValidAsAnnotation()`](https://github.com/apache/avro/blob/release-1.12.1/lang/java/compiler/src/main/java/org/apache/avro/compiler/specific/SpecificCompiler.java#L1067)), and this validation only allows annotations whose fields are either primitive or String. Therefore, annotations with at least a field whose type is a Class, an enum value, an annotation or an array are discarded.
   
   For example, with this annotation:
   
   ```java
   public @interface MyAnnotation {
   
       int primitive() default 1;
   
       String text() default "arg1";
   
       Class<?> clazz() default Random.class;
   
       ElementType enumValue() default ElementType.FIELD;
   
       Override annotation() default @Override;
   
       String[] array() default {"arg1", "arg1"};
   
   }
   ```
   
   and this Avro schema:
   
   ```avsc
   {
     ...
     "fields": [
       {
         "name": "primitive",
         "type": "string",
         "javaAnnotation": "my.package.MyAnnotation(primitive = 1)"
       },
       {
         "name": "text",
         "type": "string",
         "javaAnnotation": "my.package.MyAnnotation(text = \"arg1\")"
       },
       {
         "name": "clazz",
         "type": "string",
         "javaAnnotation": "my.package.MyAnnotation(clazz = java.util.Random.class)"
       },
       {
         "name": "enumValue",
         "type": "string",
         "javaAnnotation": "my.package.MyAnnotation(enumValue = java.lang.annotation.ElementType.FIELD)"
       },
       {
         "name": "annotation",
         "type": "string",
         "javaAnnotation": "my.package.MyAnnotation(annotation = @Override)"
       },
       {
         "name": "array",
         "type": "string",
         "javaAnnotation": "my.package.MyAnnotation(array = {\"arg1\", \"arg1\"})"
       }
     ]
   }
   ```
   ✅ the following Java class will be generated with Avro 1.12.0:
   
   ```java
   @org.apache.avro.specific.AvroGenerated
   public class MyClass extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
     
     [...]
     
     @my.package.MyAnnotation(primitive = 1)
     private java.lang.String primitive;
     @my.package.MyAnnotation(text = "arg1")
     private java.lang.String text;
     @my.package.MyAnnotation(clazz = java.util.Random.class)
     private java.lang.String clazz;
     @my.package.MyAnnotation(enumValue = java.lang.annotation.ElementType.FIELD)
     private java.lang.String enumValue;
     @my.package.MyAnnotation(annotation = @Override)
     private java.lang.String annotation;
     @my.package.MyAnnotation(array = {"arg1", "arg1"})
     private java.lang.String array;
   
     [...]
   }
   ```
   
   ❌ and this one with Avro 1.12.1:
   
   ```java
   @org.apache.avro.specific.AvroGenerated
   public class MyClass extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
     
     [...]
     
     @my.package.MyAnnotation(primitive = 1)
     private java.lang.String primitive;
     @my.package.MyAnnotation(text = "arg1")
     private java.lang.String text;
     private java.lang.String clazz;
     private java.lang.String enumValue;
     private java.lang.String annotation;
     private java.lang.String array;
   
     [...]
   }
   ```
   
   that is, annotations of fields `clazz`, `enumValue`, `annotation` and `array` are missing.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@avro.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org