users@jersey.java.net

Re: [Jersey] Jersey - JAXB Marshalling Error - Field Name Similar to Method Name - Bug?

From: Chris Winters <chris.winters_at_gmail.com>
Date: Mon, 20 Apr 2009 08:40:16 -0400

Worth mentioning is that you can do this for all classes in a package
as well by putting the annotation on your package in a
'package-info.java' file, something like:

@XmlAccessorType( XmlAccessType.FIELD )
package com.vocollecthealthcare.yosemite.resource;

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;

Chris

2009/4/20 Felipe Gaścho <fgaucho_at_gmail.com>:
> problem is: by default the serialization uses the properties instead
> of the fields.. so you finish with two properties with same name :(
> this is tricky and confuse at first moment, but there is a simple
> solution: to define what type of atributes accessor the serialization
> should use:
>
>
> @XmlAccessorType(XmlAccessType.FIELD)
> @javax.xml.bind.annotation.XmlRootElement
> public class Artifact {
> ...
> }
>
>
> I also use another annotation to define the order of the elements in
> my serialized types:
>
> @XmlRootElement(namespace = "blah.blah.your.ns")
> @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
> @XmlAccessorType(XmlAccessType.FIELD)
> public class Artifact {
> ...
> }
>
>
>
> On Mon, Apr 20, 2009 at 12:13 PM, James Allchin <james.allchin_at_gmail.com> wrote:
>> Hi,
>>
>> New to all web service frameworks in Java. But think I may have found a bug
>> with Jersey REST Web services and JAXB (I am using JAX-RS 2.1 with JDK 1.6)
>>
>> I am using Jersey with Tomcat 6.0. I have a really simple web service which
>> returns an object called Artifact using a GET method.
>>
>> I am using standard annotations to allow the the Artifact class to be
>> marshalled and serialized correctly into XML.
>>
>> Here is my Artifact class:
>>
>> @javax.xml.bind.annotation.XmlRootElement
>> public class Artifact {
>>
>>
>>     @javax.xml.bind.annotation.XmlElement
>>     protected long artifactId;
>>
>>     @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;
>>     }
>>
>> }
>>
>>
>> As you can see the class has 2 fields artifactId and artifactType.
>>
>> It also simple getter and setter accessor methods.
>>
>> When trying to return this object in the web service - I get the following
>> error:
>>
>> java.io.IOException: Error marshalling JAXB object of type "class
>> com.knowledgemill.entities.Artifact".
>>       com.sun.jersey.impl.provider.entity.AbstractRootElementProvider.writeTo(AbstractRootElementProvider.java:117)
>>
>>
>>
>> The hint in the error messages is:
>>
>> com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of
>> IllegalAnnotationExceptions
>> Class has two properties of the same name "artifactId"
>>
>>       this problem is related to the following location:
>>               at public long com.knowledgemill.entities.Artifact.getArtifactId()
>>
>>               at com.knowledgemill.entities.Artifact
>>       this problem is related to the following location:
>>               at protected long com.knowledgemill.entities.Artifact.artifactId
>>
>>               at com.knowledgemill.entities.Artifact
>> Class has two properties of the same name "artifactType"
>>       this problem is related to the following location:
>>
>>               at public java.lang.String
>> com.knowledgemill.entities.Artifact.getArtifactType()
>>               at com.knowledgemill.entities.Artifact
>>       this problem is related to the following location:
>>
>>               at protected java.lang.String
>> com.knowledgemill.entities.Artifact.artifactType
>>               at com.knowledgemill.entities.Artifact
>>
>>
>> Basically the framework seems to think that artifactId and artifactType are
>> declared twice.
>>
>> If I rename the get methods so that they do not read as getArtifactId and
>> getArtifactType then it works fine:
>>
>> getArtifactId -> getArtId
>> getArtifactType -> getArtType
>>
>> The code now looks like this:
>>
>> /*
>>  * To change this template, choose Tools | Templates
>>  * and open the template in the editor.
>>  */
>>
>> package com.knowledgemill.entities;
>>
>>
>> /**
>>  *
>>  * @author km
>>  */
>> @javax.xml.bind.annotation.XmlRootElement
>> public class Artifact {
>>
>>
>>     @javax.xml.bind.annotation.XmlElement
>>     protected long artifactId;
>>
>>     @javax.xml.bind.annotation.XmlElement
>>     protected String artifactType;
>>
>>
>>     public Artifact() {
>>
>>     }
>>
>>     /**
>>      * @return the artifactId
>>      */
>>
>>     public long getArtId() {
>>         return artifactId;
>>     }
>>
>>
>>     /**
>>      * @param artifactId the artifactId to set
>>      */
>>     public void setArtifactId(long artifactId) {
>>
>>         this.artifactId = artifactId;
>>     }
>>
>>     /**
>>      * @return the artifactType
>>      */
>>     public String getArtType() {
>>
>>         return artifactType;
>>     }
>>
>>     /**
>>      * @param artifactType the artifactType to set
>>      */
>>     public void setArtifactType(String artifactType) {
>>
>>         this.artifactType = artifactType;
>>     }
>>
>> }
>>
>>
>> With the methods renamed it now works fine. This looks some kind of bug to
>> me?
>>
>> Can anyone help? - I would like to keep my accessor methods with a
>> meaningful name. It's a pretty nasty workaround.
>>
>> Cheers
>>
>> James
>
>
>
> --
>
> Please help to test this application:
> http://fgaucho.dyndns.org:8080/cejug-classifieds-richfaces
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>
>