No problem; this is a common problem users hit, and unexpected one.
It is sort of a FAQ, just not sure how to write concise entry.

Note, however, that this problem does NOT happen with generic types
referenced as Java class properties -- it is strictly limited to cases
where the value is handed to Jackson, and there is no declaration (Method,
Field, constructor parameter) to give proper generic type information. So
workaround is only needed at this level and nowhere else.

-+ Tatu +-


On Fri, Oct 7, 2016 at 2:44 PM, krrrr38 <[email protected]> wrote:

> I see.
>
> I could get what I want with such ways.
>
> Thanks for quick response.
>
> 2016年10月8日土曜日 2時52分18秒 UTC+9 Tatu Saloranta:
>>
>> So, what happens is that while you think you are giving a
>> List<ExampleContent> (or List<AbstractContent>), what runtimes sees is a
>> List<? extends Object>. Since `Object` has no `@JsonTypeInfo`, no type is
>> included.
>>
>> You have been tripped by Java Type Erasure. Also, my general suggestion
>> is to NEVER EVER use generic type as the root type, but always use a
>> non-generic type. There are multiple ways to do that. Like:
>>
>> 1. Always use a POJO to contain Lists, Maps (wrapper)
>> 2. Sub-class Lists, Maps:
>>
>>     public class ExampleList extends ArrayList<AbstractContent> { }
>>
>>    because this does retain type information
>>
>> But there is also one way to make generic root type to work (although
>> with caveats)
>>
>> 1. Use `ObjectWriter`, specifying actual type, without erasure:
>>
>>    mapper.writerFor(new TypeReference<List<AbstractContent>>() {
>> }).writeValueAsString(list);
>>
>> in this case you may hit other problems, since type is now fixed for
>> content as well, so this may fail for some type definitions.
>>
>> -+Tatu +-
>>
>>
>> On Thu, Oct 6, 2016 at 5:53 PM, krrrr38 <[email protected]> wrote:
>>
>>> Hi. I use jackson-databind 2.8.3.
>>>
>>> I want to serialize value with `@JsonTypeName`. When serialize with
>>> `List`, the property value is not shown.
>>>
>>> public class Main {
>>>    public static void main(String[] args) throws Exception {
>>>        ObjectMapper om = new ObjectMapper();
>>>        System.out.println(om.writeValueAsString(new ExampleContent()));
>>>        System.out.println(om.writeValueAsString(Arrays.asList(new
>>> ExampleContent())));
>>>    }
>>>
>>>     @JsonTypeInfo(
>>>            use = JsonTypeInfo.Id.NAME,
>>>            include = JsonTypeInfo.As.PROPERTY,
>>>            property = "type",
>>>            visible = true
>>>    )
>>>    @JsonSubTypes({
>>>            @JsonSubTypes.Type(ExampleContent.class)
>>>    })
>>>    abstract static public class AbstractContent {
>>>    }
>>>
>>>     @JsonTypeName("text")
>>>    public static class ExampleContent extends AbstractContent {
>>>    }
>>> }
>>>
>>>
>>> result
>>>
>>> {"type":"text"}
>>> [{}]
>>>
>>>
>>> expected?
>>>
>>> {"type":"text"}
>>> [{"type":"text"}]
>>>
>>> Do I need to add more annotation or something?
>>>
>>> Regargs.
>>>
>>> --
>>> 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.
>>>
>>
>> --
> 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.
>

-- 
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.

Reply via email to