users@jersey.java.net

[Jersey] Jersey unable to unmarshal a custom type using SortedSet

From: Abhijit Sarkar <abhijit.sarcar_at_gmail.com>
Date: Mon, 25 Jul 2011 13:59:47 -0400

Hi,
I have a resource that returns OrderedAssembly<Movie>. Problem is the client
wouldn't recognize the actual type argument (Movie) and is sending wrong
type to the Comparator .
Greatly appreciate any suggestion/help. The classes are as follows.

Client:
public void sendJerseyRequest() {
    ClientConfig cc = new DefaultClientConfig();
    cc.getSingletons().add(MovieSetMessageBodyReader.class);
    Client client = Client.create(cc);
    WebResource webResource = client.resource(GLASSFISH_ENDPOINT_URI);
    webResource.accept(MediaType.TEXT_XML);
    GenericType<OrderedAssembly<Movie>> assemblyType = new
GenericType<OrderedAssembly<Movie>>() {
    };
    System.out.println("sendJerseyRequest: " + assemblyType.getRawClass());
    System.out.println("sendJerseyRequest: " + assemblyType.getType());
    OrderedAssembly<Movie> movies = webResource.queryParam("path", PATH)
        .get(assemblyType);

    System.out.println(movies);
    }

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.76 sec <<<
FAILURE!
testSendJerseyRequest(name.app.abhi.movieservice.ejb.restful.client.MovieSer
viceEjbRestfulClientTest) Time elapsed: 0.666 sec <<< ERROR!
java.lang.IllegalArgumentException: Invalid type parameter e1:
com.sun.org.apache.xerces.internal.dom.ElementNSImpl. Only
name.app.abhi.moviemanager.domain.Movie accepted.
    at
name.app.abhi.moviemanager.service.impl.MovieComparator.compare(MovieCompara
tor.java:14)
    at java.util.TreeMap.put(TreeMap.java:530)
    at java.util.TreeSet.add(TreeSet.java:238)
    at
com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPa
ck(Lister.java:290)
    at
com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPa
ck(Lister.java:254)
    at
com.sun.xml.internal.bind.v2.runtime.unmarshaller.Scope.add(Scope.java:106)

===============================================
Movie:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "movie", propOrder = { "name", "year", "genre", "filesize",
    "fileExtension", "parent" })
public class Movie implements Serializable {
    // fields, getters and setters
}

===============================================

OrderedAssembly:

@XmlRootElement(name = "movie-set", namespace =
"http://name.app.abhi/movieservice")
@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class OrderedAssembly<Movie> {

    @XmlElement(name = "movie")
    SortedSet<Movie> elements = new TreeSet<Movie>(new
MovieComparator<Movie>());

    public OrderedAssembly() {
    }

    public OrderedAssembly(SortedSet<Movie> ss) {
    addAll(ss);
    }

    public OrderedAssembly(SortedSet<Movie> ss, Comparator<Movie>
comparator) {
    elements = new TreeSet<Movie>(comparator);

    addAll(ss);
    }

    public SortedSet<Movie> getElements() {
    return elements;
    }

    private void addAll(SortedSet<Movie> ss) {
    if (ss != null) {
        elements.clear();
        elements.addAll(ss);
    }
    }
}