This is now OT for Restlet, and I don't know enough about Jackson
annotations to help. Best to look at the Jackson forums.

--tim

On Tue, Apr 19, 2011 at 1:00 PM, Steve Ferris <[email protected]>wrote:

> So AMRecord on server -> JSON -> AMRecord on client, but Set<AMRecord> on
> server -> JSON -> Set<LinkedHashMap> on client? If so, read on.
>
> Restlet's JacksonRepresentation uses mapper.readValue(representation,
> targetType.class) to do the work, but type parameters are erased, so the
> return type is Set.class, and the call becomes
> mapper.readValue(representation, Set.class). Jackson does the best it can in
> that case; the serialized AMRecord looks like a map.
>
>
> Excellent, thanks very much. This explains the underlying flow very
> clearly.
>
>
> There are two ways to handle this. If you control the source for AMRecord,
> you can tell Jackson (by adding an annotation) to include type information
> when it serializes an AMRecord, so that it will be reconstituted properly.
> If you don't have access to the source, you'll need to either introduce a
> holder type for Set<AMRecord> or write your own subclass of
> JacksonRepresentation with custom handling for this case.
>
>
> I have the source to AMRecord, but from reading through this:
>
> http://wiki.fasterxml.com/JacksonAnnotations
>
> It is unclear to me if the granularity of the annotation is at the class
> level or if I need one annotation per property?
>
> regards
> Steve
>
>
>
> --tim
>
> On Tue, Apr 19, 2011 at 10:46 AM, Steve Ferris <[email protected]
> > wrote:
>
>> Hi,
>>
>> That is indeed the reason for the class cast exception, but on the server
>> the Set is populated with AMRecord objects and after the Jackson
>> representation un-marshalling the AMRecord object has become a
>> LinkedHashMap.
>>
>> So there has to be something going on in the Jackson/JSON representation
>> implementation that prevents my custom class working in a collection, but
>> fine when it's just on its own.
>>
>> regards
>> Steve
>>
>>  --
>> Steve Ferris : ForgeRock AS : e: [email protected]
>> t: +44 (0)7813 709285 f: +44 (0)7971 042421 w: forgerock.com
>> OpenAM, the new name for OpenSSO
>>
>> On 19 Apr 2011, at 3:40pm, Tim Peierls wrote:
>>
>> A LinkedHashMap is not a Set. Could that explain the class cast exception?
>>
>> --tim
>>
>> On Tue, Apr 19, 2011 at 7:13 AM, Steve Ferris <[email protected]
>> > wrote:
>>
>>> Hi,
>>>
>>> I have a custom class AMRecord which is being handled in an unexpected
>>> way.
>>>
>>> Two RESTlet calls:
>>>
>>>     @Get
>>>     public AMRecord read(String id) {
>>>
>>> and
>>>
>>>     @Get
>>>     public Set<AMRecord> readWithSecKey(String id) {
>>>
>>> Jackson can cope with AMRecord as the read call works, my client code
>>> looks like this:
>>>
>>>         ClientResource resource = new ClientResource(resourceUrl +
>>> "/read");
>>>         ReadResource readResource = resource.wrap(ReadResource.class);
>>>
>>>         AMRecord record = readResource.read("43478392743");
>>>
>>> I get back an AMRecord instance.
>>>
>>> But for the Set, on the client I get a class cast exception
>>>
>>>         ClientResource resource = new ClientResource(resourceUrl +
>>> "/readwithseckey");
>>>         ReadWithSecKeyResource secReadResource =
>>> resource.wrap(ReadWithSecKeyResource.class);
>>>
>>>         Set<AMRecord> sessions =
>>> secReadResource.readWithSecKey("uid=steve,ou=users,o=openam");
>>>
>>> This is because the Set sessions has a LinkedHashMap rather than AMRecord
>>> entries. The LinkedHashMap is populated with the data from the AMRecord that
>>> should be present.
>>>
>>> Any ideas?
>>>
>>> thanks
>>> Steve
>>>
>>> --
>>> Steve Ferris : ForgeRock AS : e: [email protected]
>>> t: +44 (0)7813 709285 f: +44 (0)7971 042421 w: forgerock.com
>>> OpenAM, the new name for OpenSSO
>>>
>>>
>>
>>
>
>

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2721482

Reply via email to