Hi Tatu, The example was using the ClassNameIdResolver as the default resolver (it was buried in the linked test case, sorry about the obscurity).
I took a deeper look at the Jackson-dataformat-ion code and think I found the issue. It seems Jackson does provide all the options necessary to make this work like you had thought. However, the IonAnnotationTypeSerializer <https://github.com/FasterXML/jackson-dataformat-ion/blob/master/src/main/java/com/fasterxml/jackson/dataformat/ion/polymorphism/IonAnnotationTypeSerializer.java> didn't implement the "writeTypePrefixForScalar <https://github.com/FasterXML/jackson-dataformat-ion/blob/master/src/main/java/com/fasterxml/jackson/dataformat/ion/polymorphism/IonAnnotationTypeSerializer.java#L68-L70>" method so the opportunity to write the ion annotation for @JsonValue types was ignored. After adding the necessary code to write the ion annotation to this method (copying from "writeTypePrefixForObject <https://github.com/FasterXML/jackson-dataformat-ion/blob/master/src/main/java/com/fasterxml/jackson/dataformat/ion/polymorphism/IonAnnotationTypeSerializer.java#L74-L85>" method), it works as expected and the annotation is written on serialization. Michael On Monday, June 26, 2017 at 6:39:34 PM UTC+1, Tatu Saloranta wrote: > > I haven't quite read the whole thing, but first things first: I think > that you should not try to combine `@JsonValue` with polymorphic type > handling. This is problematic because of ambiguity (during processing) > between type of Java Object being returned by method, and logical type > it represents (that is, POJO that has @JsonValue-annotated method). > Similar problem affects Delegating `@JsonCreator` approach. > > Jackson internals will try to handle this case best it can, but as > things are I am not 100% confident things work end-to-end. > Specific issues relate to TypeSerializer/TypeDeserializer not having > proper context to know the distinction (here's the Object for which > type id; and here's Object with contents to serialize), as well as > possibly differing representations for the two ("shape" in JSON). > > Having said all of above, code included seems to be missing actual > `@JsonTypeInfo` on `ClassA`. > Is this intentional? (possible default typing is enabled) > > -+ Tatu +- > > > On Sun, Jun 25, 2017 at 10:05 AM, Michael Liedtke <[email protected] > <javascript:>> wrote: > > Hello, > > I was hoping for some feedback on the following problem involving Type > > Resolvers during serialization of classes that use @JsonValue. The > example I > > will give will use the upcoming Ion data-format. Specifically, using Ion > > type annotations to resolve types via the > IonAnnotationTypeResolverBuilder > > much like the PolymorphicRoundTripTest. > > > > Given a mapper configured with a module much like in the linked test: > > > > IonObjectMapper mapper = new IonObjectMapper(); > > mapper.registerModule(new IonAnnotationModule()); > > > > > > And the following classes: > > > > > > @JsonTypeResolver(IonAnnotationTypeResolverBuilder.class) > > public static class ClassA {} > > public static class SubClassB extends ClassA { > > public final String value; > > @JsonCreator > > public SubClassB(String value) { > > this.value = value; > > } > > @JsonValue > > public String getValue() { > > return value; > > } > > > > > > > > @Override > > > > public String toString() { > > > > return "SubClassB[value=" + value + "]"; > > > > } > > > > } > > > > > > I can successfully deserialize to the correct type: > > > > ClassA a = > mapper.readValue("'some.test.package.SubClassB'::\"some_value\"", > > ClassA.class); > > > > System.out.println(a); //Output: SubClassB[value=some_value] > > > > > > But cannot seem to include type information when serialization: > > > > System.out.println(mapper.writeValueAsString(a)); //Output: "some_value" > > > > > > The desired output would be: > 'some.test.package.SubClassB'::"some_value". Is > > this possible? I see a potential option in the JsonValueSerializer > class > > but unsure if/how this would be used to solve the problem. > > > > Thank you, > > Michael > > > > > > -- > > 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] <javascript:>. > > To post to this group, send email to [email protected] > <javascript:>. > > For more options, visit https://groups.google.com/d/optout. > -- 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.
