users@jersey.java.net

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

From: Pavel Bucek <pavel.bucek_at_oracle.com>
Date: Wed, 27 Jul 2011 16:35:17 +0200

Abhijit filled an issue: http://java.net/jira/browse/JERSEY-747

(discussion continues there)

On 7/25/11 6:15 AM, Abhijit Sarkar wrote:
> 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.MovieServiceEjbRestfulClientTest)
> 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(MovieComparator.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.addToPack(Lister.java:290)
> at
> com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(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);
> }
> }
> }