You're very welcome. Glad you have it sorted.
On Fri, May 11, 2018 at 12:48 PM, Carlos Alonso <[email protected]> wrote: > 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 <[email protected]> > 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 <[email protected]> >> 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! >>> >> >>
