1

I'm trying to get deserialization of subclasses working in Jackson. I defined a simple POJO and some sublcasses, but I'm getting the following exception when deserializing:

06-25 10:06:32.765: E//RequestProcessor.java:251(26690): Caused by: java.lang.IllegalArgumentException: Invalid type id 'org.moser.pointer.rest.Query' (for id type 'Id.class'): no such class found

Here are the Pojos:

package org.moser.pointer.rest;

import org.codehaus.jackson.annotate.JsonSubTypes;
import org.codehaus.jackson.annotate.JsonTypeInfo;

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
@JsonSubTypes({
@JsonSubTypes.Type(value=Query.class, name="org.moser.pointer.rest.Query"),
@JsonSubTypes.Type(value=Tip.class, name="org.moser.pointer.rest.Tip"),
})
public class Comment {

private String text;
private String authorThumbnailUrl;
private String username;
private String userid;

public Comment(){}

public Comment(String text, String author, String authorThumbnailUrl) {
    this.text=text;
    this.username=author;
    this.authorThumbnailUrl=authorThumbnailUrl;
}

public String getText() {
    return text;
}
public void setText(String text) {
    this.text = text;
}
public String getAuthorThumbnailUrl() {
    return authorThumbnailUrl;
}
public void setAuthorThumbnailUrl(String authorThumbnailUrl) {
    this.authorThumbnailUrl = authorThumbnailUrl;
}
public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}

public String getUserid() {
    return userid;
}

public void setUserid(String userid) {
    this.userid = userid;
}
}

And this is the subclass:

package org.moser.pointer.rest;

public class Query extends Comment {

private long timeToLive;

public long getTimeToLive() {
    return timeToLive;
}
public void setTimeToLive(long timeToLive) {
    this.timeToLive = timeToLive;
}
}

It's an Android application and the POJO's package is imported as external. Serialization/deserialization is managed by Spring Android's RestTemplate. I think it could be a class loader issue but I have no idea on why it occurs and how to solve it.

I also tried this simple test in Java SE and all works fine:

public class JacksonTest {


public static void main(String args[]){

    ObjectMapper mapper = new ObjectMapper(); 

    Query query=new Query();
    query.setText("text");
    query.setAuthorThumbnailUrl("authorThumbnailUrl");
    query.setTimeToLive(0);
    query.setUserid("userId");
    query.setUsername("username");

    String json;
    try {
        json = mapper.writeValueAsString(query);
        System.out.println(json);
        Query read = (Query) mapper.readValue(json, Comment.class);
        System.out.println(mapper.writeValueAsString(read));  
    } catch (JsonGenerationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JsonMappingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
}

Any suggestion?

user1781028
  • 1,478
  • 4
  • 22
  • 45

0 Answers0