On 17/05/13 12:59, Zach Calvert wrote:
Thank you for the quick reply.  I am curious, is this a problem with the
provider ignoring the XmlAccessorType, since even with the
XmlAccessorType(XmlAccessTpe.NONE) I still get the ID field as output in
JSON?  Is this a bug or am I incorrect in my understanding of JAXB
Annotations?
JSONProvider does not deal with/check JAXB annotations, it only processes JAXB writer events

Cheers, Sergey


Thanks,
Zach Calvert


On Fri, May 17, 2013 at 6:56 AM, Sergey Beryozkin <[email protected]
<mailto:[email protected]>> wrote:

    Hi

    On 17/05/13 12:36, Zach Calvert wrote:

        Hello,
        I'm using Apache CXF Bundle jar version 2.3.2, so I know I'm
        behind in
        versions, but I've yet to come across a bug that identifies my
        current
        problem.

        I have the following class hierarchy:
        public class A {
              protected long id;

              public Long getId() {
                  return id;
              }

              public void setId(Long id) {
        this.id <http://this.id> = id;
              }
        }

        public class B extends A {
        private String guid;
           public String getGuid() {
                  return guid;
              }

              public void setGuid(String guid) {
                  this.guid = guid;
              }
        }

        Now, my problem is that I want my XML JSON support to look like
        {"id":"guid content"}
        Where I'm marshalling B, and the ID field represented in the JSON is
        actually set in the guid value of A.  The JSON marhsall and
        unmarshall
        should be ignorant and uncaring of the true "ID" field in class
        type A.  If
        you're guessing what I'm doing here, A is a hibernate entity and
        B is what
        is reflected to the user.  I do not want to expose the actual ID
        field of A
        in my JSON, nor do I want to have to write a new class B to
        support the
        marshalling.  I do not have access to update the annotations on
        A, so all
        of my annotating can only be done on class B.  There are no Xml
        annotations
        on class A.

        I have tried
        @XmlAccessorType(__XmlAccessType.NONE) on class B and I still
        get the ID
        content in my JSON.
        I have tried
        @XmlType(propOrder = {"guid"})
        on class B and still get the ID content in my JSON.
          Suprisingly, if I add
        a bug field like @XmlType(propOrder = {"guid", "garbage"}) to my
        prop
        order, JSON will throw up an exception at me, but if I keep it
        neat and
        clean to just guid, I still get both {"id":1,"guid":"guid
        content"} when I
        demarshall an instance of B.
        I have tried
        @Override
        @XmlTransient
        public Long getId() {
             return super.getId();
        }
        and still get the ID field in my JSON.  Frankly, it looks like
        none of my
        annotations on class B are overriding the fact that class A
        exposes a field
        called ID.

        Is there a manual way to tell the provider "hey, I really really
        really
        don't want you to marshall this ID field"?

    In CXF 2.3.2, you can configure JSONProvider with an outDropElements
    property, see:
    
http://cxf.apache.org/docs/__jax-rs-data-bindings.html#JAX-__RSDataBindings-__CustomizingJAXBXMLandJSONinput__andoutput
    
<http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-CustomizingJAXBXMLandJSONinputandoutput>

    HTH, Sergey


        Thank you,
        Zach Calvert






Reply via email to