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