Hi Tim, many thanks for your help. It's definitely interesting, but
unfortunately not useful this time, I think, as that JsonTypeInfo and
JsonSubClasses annotations are on the base class, which, in my case, I
don't own and even if I did, I don't think I could list all the subclasses
GenericJson has.

I've discovered, though, that I can configure the ObjectMapper to add that
type information to all objects using 'enableDefaultTyping'
https://fasterxml.github.io/jackson-databind/javadoc/2.8/com/fasterxml/jackson/databind/ObjectMapper.html#enableDefaultTyping
()

Thanks!

On Wed, May 9, 2018 at 8:01 PM Tim Robertson <timrobertson...@gmail.com>
wrote:

> Hi Carlos
>
> Here is an example of subclassing with Jackson using the @Type annotation
> that I did many years ago:
>
> https://github.com/gbif/gbif-api/tree/master/src/main/java/org/gbif/api/model/registry/eml/temporal
>
> It decorates the JSON with an extra field ("@Type" in this case) which
> instructs the deserializers which Object to instantiate. I'm not sure if
> newer Jackson versions have changed.
>
> I haven't considered if this is appropriate or not in your case, but I
> hope this helps with the Jackson bit of your question at least.
>
> Best wishes,
> Tim
>
>
>
>
>
>
>
> On Wed, May 9, 2018 at 7:02 PM, Carlos Alonso <car...@mrcalonso.com>
> wrote:
>
>> Hi everyone!!
>>
>> I'm working on BEAM-4257 issue and the approach I'm following is to
>> create a new class 'BigQueryInsertError' that also extends 'GenericJson'
>> and that contains three keys 'TableRow row',
>> 'TableDataInsertAllResponse.InsertErrors error', and 'TableReference ref'
>> and use this type as the contained items returned by
>> WriteResults.getFailedInserts
>>
>> I have now to create a Coder for this new type and I'm following the
>> TableRowJsonCoder way
>> https://github.com/apache/beam/blob/master/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/TableRowJsonCoder.java#L34
>>  by
>> relying on Jackson's ObjectMapper and StringUtf8Encoder.
>>
>> The problem is that I always get errors when deserialising as it
>> deserialises the inner TableRow as a LinkedHashMap and fails when trying to
>> assign it. Here you can see the full stacktrace:
>> https://pastebin.com/MkUD9L3W
>>
>> Testing it a bit further I've spotted other GenericJson subclasses that
>> cannot be encoded/decoded following that method. For example
>> TableDataInsertAllResponse.InsertErrors itself. See the example below:
>>
>> TableDataInsertAllResponse.InsertErrors err = new 
>> TableDataInsertAllResponse.InsertErrors().setIndex(0L);
>> ObjectMapper mapper = new 
>> ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
>> mapper.readValue(mapper.writeValueAsString(err), 
>> TableDataInsertAllResponse.InsertErrors.class);
>>
>>
>> Fails with a similar error, but in this case is because it deserialises
>> the index into an int: https://pastebin.com/bzXMR3z5
>>
>> So a couple of questions here:
>> * Which is the appropriate way of encoding/decoding GenericJson
>> subclasses? (Maybe this issues can be tackled using Jackson's type
>> annotations, but I'm quite a newbie on Jackson and I couldn't figure out
>> how)
>> * This will (hopefully) be my very first contribution to Apache Beam and
>> I'd like to get some feedback/comments/ideas/... on the issue and the
>> suggested solution.
>>
>> Thanks everyone!
>>
>
>

Reply via email to