users@jersey.java.net

Jersey JAX-RS JAXB - Returning an Array of Objects

From: James Allchin <james_at_knowledgemill.com>
Date: Tue, 21 Apr 2009 11:08:49 +0100

Hi,

Thanks for the great response on my last post.

This time I am having difficulty dealing with arrays.

In my previous post I was having problems with returning a custom Object
(with JAXB annotations).

I am now having difficulties generating the XML for an Array of these
Objects.

My example class is called Artifact:

import javax.xml.bind.annotation.*;

/**
 *
 * @author km
 */
@javax.xml.bind.annotation.XmlRootElement
@javax.xml.bind.annotation.XmlAccessorType(XmlAccessType.FIELD)
public class Artifact {

    //_at_javax.xml.bind.annotation.XmlElement
    protected long artifactId;

    //_at_javax.xml.bind.annotation.XmlElement
    protected String artifactType;

    public Artifact() {
    }

    /**
     * @return the artifactId
     */
    public long getArtifactId() {
        return artifactId;
    }

    /**
     * @param artifactId the artifactId to set
     */
    public void setArtifactId(long artifactId) {
        this.artifactId = artifactId;
    }

    /**
     * @return the artifactType
     */
    public String getArtifactType() {
        return artifactType;
    }

    /**
     * @param artifactType the artifactType to set
     */
    public void setArtifactType(String artifactType) {
        this.artifactType = artifactType;
    }

}

This class is all good - works well when marshalling and serlializing to
XML.

An example of the method that returns the XML for this object is shown
below:

    @GET
    @Path("/user/{userId}/artifacts/{artifactId}")
    //_at_Produces("application/json")
    public Artifact getArtifact (@PathParam("userId") long userId
                               , @PathParam("artifactId") long artifactId) {
        Artifact returnedArtifact = null;
        try {
          returnedArtifact = dA.getArtifact(0, userId, artifactId);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return returnedArtifact;
    }

This works great.

However, when I introduce a new method which returns an Array of Artifact
objects. I get problems:

    @GET
    @Path("/user/{userId}/artifacts")
    public Artifact[] getArtifacts (@PathParam("userId") long userId) {
        Artifact[] returnedArtifacts = null;
        try {
          System.out.println("userId value is " + userId);
          returnedArtifacts = dA.getArtifacts(1, userId);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return returnedArtifacts;
    }


In this case I get the following error:

SEVERE: A message body writer for Java type, class
[Lcom.knowledgemill.entities.Artifact;, and MIME media type, text/xml, was
not found
javax.ws.rs.WebApplicationException
        at
com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:239)
        at
com.sun.jersey.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:752)
        etc.. etc...

Basically, my question is - How do I serlialize and array of the custom
objects.

Perhaps I have to use a collection instead (this would be disappointing -
arrays seem neater and more efficient).

Thanks for any help.

Regards,

James