On Fri, Dec 21, 2018 at 12:06 AM matt Smith <[email protected]> wrote:
>
> so I have made this wrapper and annotated getter with @JsonSerialize. 
> however, I do not see it being applied. what is wrong here?

That looks like it should work. If not, a unit test & issue would make sense.

-+ Tatu +-

>
> public class Wrapper {
>
>
>     private Map<RecordDomain, ItemRow> foo;
>
>
>     public Wrapper(Map<RecordDomain, ItemRow> fooz) {
>         foo = new HashMap<>(fooz);
>     }
>
>
>     @JsonSerialize( contentUsing = ItemRowSerializer.class)
>     public Map<RecordDomain, ItemRow> getFoo() {
>         return foo;
>     }
>
>
>     public void setFoo(Map<RecordDomain, ItemRow> foo) {
>         this.foo = foo;
>     }
> }
>
>
> On Thursday, December 20, 2018 at 1:25:59 PM UTC-8, Tatu Saloranta wrote:
>>
>> On Thu, Dec 20, 2018 at 11:22 AM matt Smith <[email protected]> wrote:
>> >
>> > I encountered a case where class level JsonSerializable annotation does 
>> > not require registration with Simple Module  but method level does.
>>
>> Hmmh. This seems odd, let's see.
>>
>> > Here is the example I tried
>> >
>> > @JsonSerialize(using = ItemRowSerializer.class )
>> >         private ItemRow tes
>> > tItem(){
>> >             return new ItemRow("abc", Arrays.asList("item1", "item2", 
>> > "item3"));
>> >         }
>> >
>> >
>> > I test it out like this
>> >
>> >
>> > String jsonResult =  new ObjectMapper().writeValueAsString(testItem());
>> > System.out.println(jsonResult);
>> >
>> > I noticed that jsonString did not serialize using ItemRowSerializer.
>>
>> Ah. No, it won't. Jackson does not see you calling the method; Jackson
>> sees the object you pass, which was returned by the method. There is
>> no linkage there: Jackson can only introspects classes you pass to it.
>>
>> > However, when I did this, it gave the expected jsonString
>> >
>> >
>> > SimpleModule module = new SimpleModule()
>> >  module.addSerializer(ItemRowSerializer.class)
>> >  mapper.register(module);
>> >  String jsonResult =  new ObjectMapper().writeValueAsString(testItem());
>> >  System.out.println(jsonResult);
>> >
>> >
>> > On the otherhand, if I had my ItemRow class annoated with 
>> > @JsonSerializable,  there was no need with module at all.
>>
>> I think you mean `@JsonSerialize` here (there is interface type
>> `JsonSerializable`, but no annotation).
>>
>> > i.e
>> >
>> > @JsonSerializable(using = ItemRowSerailizer
>> > public class ItemRow<T> {...}
>> >
>> >
>> > Since I am passing this serialized object over the wire, I do not prefer 
>> > to write to mapper and send string representation across.
>> >
>> > how would I go about getting method level annotation working without 
>> > module registration?
>>
>> Method level annotations only work when property is accessed via
>> method (or field) in question.
>>
>> So if you had something like:
>>
>> public class Rows
>>    @JsonSerialize(using = .... )
>>    public ItemRow<Type> getRows() { ... }
>> }
>>
>> and serialized an instance of `Rows`, serializer would be found. But
>> for root values, there is no such reference.
>>
>> On related note, I strongly recommend always using a wrapper type
>> around generic values, so that root value is never of generic type.
>> Reason for this is that Java Type Erasure will often cause problems if
>> attempting to pass an instance of generic type -- so Jackson can not
>> detect intended type (all it sees is type variable from class
>> declaration).
>>
>> So, attempts to serialize, say, Row<T>, will be seen as `Row<?>`, and
>> possibly (although not always) cause issues in finding handlers for
>> the type -- for example, if value type has annotations, they may not
>> be visible.
>>
>> -+ 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.

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