Tatu, thanks for the response.
I apologize for the muddled example- deserialization can find an object
with type id, string, or array of either/both.
What I've implemented that works for all test cases so far is
1.
objectMapper.addHandler(new DeserProblemHandler());
2.
public class DeserProblemHandler extends DeserializationProblemHandler {
public JavaType handleMissingTypeId(DeserializationContext ctxt, JavaType
baseType, TypeIdResolver idResolver, String failureMsg) {
return TypeFactory.defaultInstance().constructType(baseType.
getRawClass());
}
}
3. Add a constructor to each of the polymorphic classes that takes a string
argument.
Do you see any problem with this?
Thanks again for the response-- Mike
On Saturday, December 29, 2018 at 5:23:03 PM UTC-6, Tatu Saloranta wrote:
>
> On Sat, Dec 29, 2018 at 3:01 PM Mike Summers <[email protected]
> <javascript:>> wrote:
> >
> > I have a Spring Boot (2.1.1) app that is modeling ActivityStreams
> objects and for the most part Jackson's (2.9.7) Polymorphic Deserialization
> works well.
> >
> >
> > There are 'objects' in the JSON which are references (links) and not
> JSON objects with type information. For instance
> >
> >
> > "actor":"https://some.actors.href/
> >
> >
> > rather than
> >
> >
> > "actor":{
> > "type":"Actor",
> > "name":"SomeActor"
> > }
> >
> >
> > I've written custom deserializers and and placed them on the fields to
> deal with this
> >
> >
> > @JsonDeserialize (using = ActorOrLinkDeserializer.class)
> > private Actor actor;
> >
> >
> > However my ActorOrLinkDeserializer is instantiated but never called and
> Jackson complains with
> >
> >
> > Missing type id when trying to resolve subtype of [simple type, class
> org.w3.activity.streams.Actor]: missing type id property 'type' (for POJO
> property 'actor')
> >
> >
> >
> > which is from the polymorphic deserializer.
> >
> >
> > It appears that the polymorphic deserialization code takes precedence
> over my local @JsonDeserialize annotation and I need a way to force my code
> to have precedence when a @JsonDeserializer annotated field is encounted.
> >
> >
> > I've tried using my own ObjectMapper with a SimpleModule and get the
> same result.
> >
> >
> > I'd appreciate pointers and suggestions.
>
> I think what is probably missing here is that to support polymorphic
> handling, both serializer and deserializer must do bit more than just
> handle content since Type Ids are configurable (both by what is used
> as id and by how that id is included in json).
> So it is not enough to simply specify one `deserialize()` method in
> custom deserializer.
>
> If serialization is always as JSON String, this may be solved simply
> by extending `StdScalarDeserializer` instead of `StdDeserializer`
> (there is rarely any need to extend base `JsonDeserializer` directly),
> as it defines `deserializeWithType()` properly knowing that
> serialization is as JSON scalar type (that is, not as JSON Object or
> Array).
>
> Similar handling is needed on serializer side too, see
> `StdScalarSerializer`. If json serialization requires different shape,
> they can still work as an example of kind of work that is needed to
> support handling of polymorphic type ids.
>
> I hope this helps,
>
> -+ Tatu +-
>
--
You received this message because you are subscribed to the Google Groups
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.