I have a feeling this is the best I can do with writeXsiType=false?
{"widget":{"id":"","name":"Hello World"}}
There isn't a built-in option to omit the "id" entry entirely or set it to null?
________________________________
From: Sergey Beryozkin <[email protected]>
To: [email protected]
Sent: Sunday, April 15, 2012 2:22 PM
Subject: Re: JAX-RS in v2.5.x: how to set custom JSONProvider(?) without Spring
to stop {"@xsi.nil":"true"}
Hi
On 15/04/12 19:09, Ron Grabowski wrote:
> This post was helpful in showing how to set a custom JSONProvider both with
> and without Spring:
>
>
> http://stackoverflow.com/a/6344047
>
You can do:
<init-param>
<param-name>jaxrs.providers</param-name>
<param-value>
org.apache.cxf.jaxrs.provider.JSONProvider
(writeXsiType=false)
</param-value>
</init-param>
I updated that thread too
> I'm assuming custom providers are registered before or override the built-in
> ones so they get to inspect things first?
>
Yes
> Here's some test cases explaining what I'm trying to do:
>
>
> @Test // passes
> public void JSONProviderIncludesNil() throws Exception {
> JSONProvider p = new JSONProvider();
> Widget widget = new Widget();
> widget.setName("Hello World");
> String json = toJson(p, widget, "widget", Widget.class);
>
>assertEquals("{\"widget\":{\"id\":{\"@xsi.nil\":\"true\"},\"name\":\"Hello
>World\"}}", json);
> }
>
> @Test // fails
> public void OmitNillJSONProviderExcludesNil() throws Exception {
> JSONProvider p = new OmitNillJSONProvider();
> Widget widget = new Widget();
> widget.setName("Hello World");
> String json = toJson(p, widget, "widget", Widget.class);
> assertEquals("{\"widget\":{\"name\":\"Hello World\"}}", json);
> }
>
> private<T> String toJson(JSONProvider p, T item, String root, Class<T>
> classOfT) throws Exception {
> ByteArrayOutputStream stream = new ByteArrayOutputStream();
> p.writeTo(
> new JAXBElement<T>(new QName("", root), classOfT, item), // hack ???
> classOfT, classOfT,
> classOfT.getAnnotations(),
> MediaType.APPLICATION_JSON_TYPE,
> new MetadataMap<String, Object>(),
> stream);
> return stream.toString();
> }
>
> // yes, I know XmlRootElement is missing
> @XmlAccessorType(XmlAccessType.FIELD)
> @XmlType(name = "widget", propOrder = {"id","name"})
> public static class Widget {
> @XmlElement(nillable = true) // can't change
> protected Integer id;
> @XmlElement(nillable = true) // can't change
> protected String name;
> public Integer getId() {
> return id;
> }
> public void setId(Integer id) {
> this.id = id;
> }
> public String getName() {
> return name;
> }
> public void setName(String name) {
> this.name = name;
> }
> }
>
> public class OmitNillJSONProvider extends JSONProvider {
> // ???
> }
>
> Maybe I should bypass all this jaxb annotation sillyness and just let gson
> handle serializing the object as if it didn't have any annotations?
>
JSONProvider is a default provider but if some other JSON provider can
handle this situation better, with or without JAXB, then it can be
easily registered too
HTH, Sergey
>
>
> ________________________________
> From: Ron Grabowski<[email protected]>
> To: "[email protected]"<[email protected]>
> Sent: Saturday, April 14, 2012 10:17 PM
> Subject: JAX-RS in v2.5.x: how to set custom JSONProvider(?) without Spring
> to stop {"@xsi.nil":"true"}
>
> I have objects with fields setup like this:
>
> @XmlElement(nillable = true)
> protected Integer id;
>
> that I send out via JAX-RS with @Produces(MediaType.APPLICATION_JSON). The
> json payload ends up like this when the fields aren't set:
>
>
> "id":{"@xsi.nil":"true"}
>
> I can't change the @XmlElement on the field because another part of my system
> depends on it. I want to either output:
>
> "id" : null
>
> or ideally not output that field at all in the json payload. I think I need
> extend the built in JSONProvder and tweak it (and/or Jettison) a little bit.
>
>
> How can I do that without Spring? Can someone explain a solution both in
> terms of web.xml and JAXRSServerFactoryBean (unit testing)?
>
> Thanks,
> Ron
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com