users@jersey.java.net

[Jersey] Re: _at_XmlEnumValue is not recognized by Jackson

From: Jakub Podlesak <jakub.podlesak_at_oracle.com>
Date: Fri, 08 Apr 2011 15:47:15 +0200

Hello Pengfei,

This is just a general advice, that Jackson should provide
better results in terms of the output JSON format.
You do not need to deal with the single element array thing
and non-strings etc, as the mapping goes directly
from the Java object model to JSON and vice versa.
The configuration should be much easier in the most cases.

You are also not constrained to JAXB beans only, as Jacskon
is capable of (de)serializing any Java object for you.

Anway, there might be (quite rare) cases, where the JAXB->JSON mapping
could work better for you (e.g. you want to rely on certain JAXB features,
let say XmlAdapter...).

The general advice from me would be: try the Jackson providers first,
if it works then fine, if it does not: ask Tatu/this mailing list on how
to customize
the processing, and only if there is a real blocker, try to figure out
if the JAXB->JSON mapping would work better.

HTH,

~Jakub

On 04/08/2011 02:55 PM, Pengfei Di wrote:
> Hello Jakub,
>
> you are totally right, I had tried to switch the POJO mapping back,
> and add a custom Jackson serialization implementation for the enum
> class. It does work and gives the result as expected.
> However, If I turn the POJO mapping off, the @XmlEnumValue can be
> recognized, and I can save the implementation of two classes (a
> Serializer and a Deserializer). Isn't it a better way?
> Just wondering, what is the disadvantage to turn the POJO mapping off.
>
> Pengfei
>
>
>
>
> On 04/08/2011 01:55 PM, Jakub Podlesak wrote:
>> Hi Pengfei,
>>
>> I am a bit confused. You stated you turned the POJO mapping feature off.
>> Then Jackson JAX-RS provider won't be used and you can not expect
>> anything
>> from it as the internal JAXB->JSON mapping is not leveraging the Jackson
>> features
>> described by Tatu. I think, and Tatu could confirm, if you switched the
>> POJO mapping
>> back on, and provided your own custom (Jackson) serialization
>> implementation
>> for the class, that should work for you as requested.
>>
>> ~Jakub
>>
>> On 04/08/2011 01:05 PM, Pengfei Di wrote:
>>> Hello Tatu,
>>>
>>> thank you for your hint. I just found the reason.
>>> I have to turn of the POJOMapping feature, otherwise the
>>> JacksonJsonProvider instead of the AbstractRootElementProvider will be
>>> used for JSON representation.
>>>
>>> Now what I get ist: {"myEnum": "2"}
>>> As you said, @XmlEnum is unfortunately not support.
>>> What is confusing is that there is no statement from the jackson web
>>> site, whether this annotation will be supported in the future or will
>>> not.
>>>
>>> Pengfei
>>>
>>> On 04/06/2011 06:38 PM, Tatu Saloranta wrote:
>>>> On Wed, Apr 6, 2011 at 7:00 AM, Pengfei
>>>> Di<pengfei.di_at_match2blue.com> wrote:
>>>>> Hello,
>>>>>
>>>>> I am trying to write a JAXB class, that constains a field of enum
>>>>> type, into
>>>>> JSON String. I tried with @XmlEnumValue annotation, but it doesn't
>>>>> take
>>>>> effect.
>>>>> The JAXB class looks like:
>>>>>
>>>>> @XmlRootElement
>>>>> public class MyClass {
>>>>>
>>>>> @XmlEnum(Integer.class)
>>>>> public enum MyEnum {
>>>>> @XmlEnumValue("1") INACTIVE,
>>>>> @XmlEnumValue("2") ACTIVE
>>>>> }
>>>>>
>>>>> private MyEnum myEnum;
>>>>>
>>>>> public getMyEnum(){
>>>>> return myEnum;
>>>>> }
>>>>> // setter
>>>>> ...
>>>>> }
>>>>>
>>>>> The expected JSON string is : {"myEnum":2}
>>>>> But what I get is : {"myEnum":"ACTIVE"}
>>>>>
>>>>> Does Jackson support this @XmlEnum annotation? or did I do something
>>>>> wrong?
>>>> Jackson does not support @XmlEnum -- enums will always be serialized
>>>> as Strings, unless custom serializer is used -- but
>>>> JaxbAnnotationIntrospector should support @XmlEnumValue for
>>>> customizing actual values used. So this looks like a bug, as long as
>>>> you have JAXB annotation support enabled (if not, you do need to
>>>> enable support).
>>>>
>>>> -+ Tatu +-
>>>
>
>