users@jersey.java.net

Re: [Jersey] Jersey JAX-RS JAXB - Returning an Array of Objects

From: Felipe Gaucho <fgaucho_at_gmail.com>
Date: Tue, 21 Apr 2009 12:39:53 +0200

Try Collectiom<Artifact>

Sent from my iPhone

On 21.04.2009, at 12:14, Paul Sandoz <Paul.Sandoz_at_Sun.COM> wrote:

> Hi James,
>
> What version of Jersey are you using?
>
> Paul.
>
> On Apr 21, 2009, at 12:08 PM, James Allchin wrote:
>
>> 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
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>