The java-class attribute is supported by the reflect implementation,
not by the code-generating specific implementation.  So you could
define Foo in Java with something like:

public class Foo {
  private long batchId;
  @Stringable private Timestamp timestamp;
  public Foo() {}
  public Foo(long batchId, Timestamp timestamp) { ... }
}

then use ReflectData to read/write instances.  Note that
java.sql.Timestamp doesn't have a string constructor.  Are you using a
different timestamp class?  If you're defining your own then you could
instead add the @Stringable annotation to your Timestamp class rather
than to each field where it is used.

Reflect-defined schemas can refer to specific-defined classes, but not
vice-versa, since the compiler doesn't use reflection to discover
schemas, but rather always generates from the schema alone.

Doug

On Wed, Jul 2, 2014 at 8:05 AM, Ian Hummel <i...@themodernlife.net> wrote:
> Hi gang,
>
> I'm trying to build a JSON schema with a custom type as the field instead of
> just a String.  Is "java-class" supposed to work in that use case?  I can't
> seem to make any progress.
>
> Example schema (Foo.avsc):
>
> {
>     "namespace" : "com.example",
>     "type" : "record",
>     "name" : "Foo",
>     "fields" : [
>         { "name" : "batchId", "type" : "long" },
>         { "name" : "timestamp", "type" : "string", "java-class" :
> "com.example.Timestamp" }
>     ]
> }
>
> The Timestamp class has a public constructor which takes a single String
> argument.  I even tried annotating it with @Stringable.  However, the
> generated java class always uses String, not my custom type.
>
> $ java -jar ~/Downloads/avro-tools-1.7.6.jar compile -string schema
> src/main/avro/Foo.avsc /tmp/foo
>
> From the generated .java file
>
> ...
>
>   /**
>
>    * All-args constructor.
>
>    */
>
>   public Foo(java.lang.Long batchId, java.lang.String timestamp) {
>
>     this.batchId = batchId;
>
>     this.timestamp = timestamp;
>
>   }
>
> ...
>
>
> Any help appreciated,
>
> - Ian.

Reply via email to