[ 
https://issues.apache.org/jira/browse/AVRO-2723?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17032362#comment-17032362
 ] 

Ryan Skraba commented on AVRO-2723:
-----------------------------------

OK!  Thanks for the explanation, I think I understand better.

In my experience, schemas generated through ReflectData have been usually 
"short-lived" and infrequently use schema evolution (where the default 
attribute is useful).   I have no objection to improving how schemas are 
created from POJO's via reflection, however!

I suspect that the *{{AvroDefault}}* solution was chosen precisely because it 
permits generating the whole schema without having to instantiate an instance.  
However, I'm pretty sure you *can* apply it to *{{Integer}}* and complex 
classes.

For example, the following works:

{code:java}
  static class DefaultTest {
    @AvroDefault("1")
    Integer foo;
  }

  static class ComplexDefaultTest {
    @AvroDefault("2")
    Integer bar;
    @AvroDefault("{\"foo\":3}}")
    DefaultTest inner;
  }
{code}

A couple of things to consider: 

1. there's already a *{{getDefaultValue(Field)}}*, which does something 
slightly different than the method of the same name you propose -- I'd suggest 
picking something more explicit.  *{{createSchemaDefaultValue()}}* perhaps?
2. as you point out *{{ReflectData.AllowNull}}* (used in your example) always 
generates nullable fields with null-first unions, which can only have 
*{{null}}* as a default.  You might want to switch the order of types in the 
union if a non-null default is discovered.

I think the only existing solution today (without refactoring ReflectData) 
would be to generated schema, then "massage" it manually to modify the defaults 
that it gave you before saving it.  

> Avro Java: Obtaining default values for POJO objects with ReflectData
> ---------------------------------------------------------------------
>
>                 Key: AVRO-2723
>                 URL: https://issues.apache.org/jira/browse/AVRO-2723
>             Project: Apache Avro
>          Issue Type: Wish
>          Components: java
>    Affects Versions: 1.9.1
>            Reporter: Anh Le
>            Priority: Critical
>
> Hi guys,
>  
> I've got a simple app using Avro Reflection:
>  
> {code:java}
> public class App {
>   public static void main(String[] args) {
>     testReflection();
>   }
>   static class User {
>     public String first = "Andy";
>     public String last = "Le";
>   }
>   static void testReflection(){
>     // get the reflected schema for packets
>     Schema schema = ReflectData.AllowNull.get().getSchema(User.class);
>     System.out.println(schema.toString(true));
>   }
> {code}
> The output on console will be:
> {noformat}
> {
>   "type" : "record",
>   "name" : "User",
>   "namespace" : "App",
>   "fields" : [ {
>     "name" : "first",
>     "type" : [ "null", "string" ],
>     "default" : null
>   }, {
>     "name" : "last",
>     "type" : [ "null", "string" ],
>     "default" : null
>   } ]
> }
> {noformat}
>  
> As you can see, there's no default values for fields. Would you please tell 
> me how to obtain such values?
> Thank you.
>  
>  
>  
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to