One (hopefully) last hiccup. When attempting to marshal the following xsd:
<xs:complexType name="reasontext"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute ref="xml:lang" use="required" /> </xs:extension> </xs:simpleContent> </xs:complexType> The JSONProvider produces a '$' value: "Reason": { "Text": { "$": "Invalid Query Parameter", "lang": "en" } } Is there a way to override the value? outTransformElements doesnt seem to work. as it still outputs a '$' Thanks yet again! Mike On Mon, Jun 9, 2014 at 7:55 AM, Sergey Beryozkin <sberyoz...@gmail.com> wrote: > Hi Mike > > On 09/06/14 12:42, Lambert, Michael wrote: > >> Thanks Sergey! The suggestions to use dropCollectionWrapperElement and >> dropRootElement >> worked. I apologize if the tone in my email sounded confrontational; it >> was >> not meant to be. I LOVE the tool. >> > No problems at all. In fact your messages is a sign that may be CXF > JSONProvider should enable some of the properties to by default in the > assumption that typically, a web browser is a consumer. > > Ignoring namespaces and dropping wrapper elements by default seems quite > reasonable. Possibly defaulting to using JAXBElement if no XMLRootElement > is available. It can be sensitive but I guess we have to accept that Java > JSON-to-JSON communications are less common than server to browser ones. > Likely for 3.1.0 though > > > I was however struggling to find >> a catalog of all the common parameters used to "tweek" the marshalling >> implementation; it would be nice if they were listed somewhere. I would >> love to see this in the cxf documentation somewhere (if i overlooked this >> can you please send me the link). >> >> > http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings- > CommonJAXBandJSONconfiguration > > and also the next section there... > > Though I will need to introduce tables to make it easier to read what > properties mean what, etc > > Cheers, Sergey > > > > Again, I am very grateful for you work and your prompt response. >> >> -Mike >> >> >> On Mon, Jun 9, 2014 at 5:53 AM, Sergey Beryozkin <sberyoz...@gmail.com> >> wrote: >> >> On 08/06/14 21:56, Lambert, Michael wrote: >>> >>> I take that back. Its now encapsulating the payload in a wrapper object. >>>> There should not be a "userDataType" object wrapped around the object: >>>> >>>> {"userDataType":{"id":11,"createDate":"2014-06-08T12:39: >>>> 19.284-04:00","updateDate":"2014-06-08T12:39:19.284-04:00" >>>> ,"collectionDate":"2008-09-20T12:39:19.284-04:00","data": >>>> {"name":"WeightPounds","value":134},"dataSource":{"id":" >>>> 453ba2"},"user":{"id":"0d8a7c33"}}} >>>> >>>> add dropRootElement=true >>>> >>> >>> it should read: >>> >>>> >>>> {"id":11,"createDate":"2014-06-08T12:39:19.284-04:00"," >>>> updateDate":"2014-06-08T12:39:19.284-04:00","collectionDate" >>>> :"2008-09-20T12:39:19.284-04:00","data":{"name":" >>>> WeightPounds","value":134},"dataSource":{"id":"453ba2"}," >>>> user":{"id":"0d8a7c33"}} >>>> >>>> Same with a returned collection. Its wrapping it an an anonymous root >>>> element: >>>> >>>> {"userDataCollectionType":{"userData":[{"id":"342a"," >>>> createDate":"2014-06-08T14:46:44.658-04:00","updateDate":" >>>> 2014-06-08T14:46:44.658-04:00","collectionDate":"2008-09- >>>> 20T14:46:44.658-04:00","data":{"name":"WeightPounds","value" >>>> :134},"dataSource":{"id":"453ba2"},"user":{"id":" >>>> 0d8a7c33"}},{"id":"34234a","createDate":"2014-06-08T14:46: >>>> 44.661-04:00","updateDate":"2014-06-08T14:46:44.661-04:00" >>>> ,"collectionDate":"2008-09-20T14:46:44.661-04:00","data": >>>> {"name":"WeightPounds","value":134},"dataSource":{"id":" >>>> 453ba2"},"user":{"id":"0d8a7c33"}}]}} >>>> >>>> {"userData":[{"id":"342a","createDate":"2014-06-08T14:46: >>>> 44.658-04:00","updateDate":"2014-06-08T14:46:44.658-04:00" >>>> ,"collectionDate":"2008-09-20T14:46:44.658-04:00","data": >>>> {"name":"WeightPounds","value":134},"dataSource":{"id":" >>>> 453ba2"},"user":{"id":"0d8a7c33"}},{"id":"34234a"," >>>> createDate":"2014-06-08T14:46:44.661-04:00","updateDate":" >>>> 2014-06-08T14:46:44.661-04:00","collectionDate":"2008-09- >>>> 20T14:46:44.661-04:00","data":{"name":"WeightPounds","value" >>>> :134},"dataSource":{"id":"453ba2"},"user":{"id":"0d8a7c33"}}]} >>>> >>>> add dropCollectionWrapperElement=true >>>> >>> >>> Can someone help end this madness? :-) >>> >>>> >>>> Well, why don't you use Jackson ? Surely it will work well ? >>> If you plan work with Jettison/CXF JSONProvider then you need to keep >>> tuning it, it is a very simple implementation that needs hints. And lease >>> bear in mind that some users want Java/CXF consumers to read the data >>> back... >>> >>> Cheers, Sergey >>> >>> >>> >>> >>>> >>>> On Sun, Jun 8, 2014 at 2:44 PM, Lambert, Michael < >>>> mich...@michaellambert.com >>>> >>>> wrote: >>>>> >>>>> >>>> I solved it but its non intuitive. I used the following block in my >>>> >>>>> beans.xml content file: >>>>> >>>>> <jaxrs:server id="services" address="/"> >>>>> <jaxrs:serviceBeans> >>>>> <ref bean="userDataServiceImpl" /> >>>>> </jaxrs:serviceBeans> >>>>> <jaxrs:providers> >>>>> <ref bean="jaxbProvider"/> >>>>> <ref bean="jsonProvider"/> >>>>> </jaxrs:providers> >>>>> </jaxrs:server> >>>>> <bean id="userDataServiceImpl" >>>>> class="com.healthmedia.ws.service.userdata.v1.UserDataServiceImpl" /> >>>>> <util:list id="xmlTypes"> >>>>> <value>application/xml</value> >>>>> <value>text/xml</value> >>>>> <value>application/*+xml</value> >>>>> >>>>> <value>application/vnd.com.healthmedia.user-data- >>>>> collection+xml;version=1.0</value> >>>>> <value>application/vnd.com.healthmedia.user-data+xml; >>>>> version=1.0</value> >>>>> </util:list> >>>>> <bean id="jaxbProvider" >>>>> class="org.apache.cxf.jaxrs.provider.JAXBElementProvider"> >>>>> <property name="unmarshallAsJaxbElement" value="true"/> >>>>> <property name="marshallAsJaxbElement" value="true" /> >>>>> <property name="produceMediaTypes" ref="xmlTypes"/> >>>>> <property name="consumeMediaTypes" ref="xmlTypes"/> >>>>> </bean> >>>>> <util:list id="jsonTypes"> >>>>> <value>application/json</value> >>>>> <value>application/*+json</value> >>>>> >>>>> <value>application/vnd.com.healthmedia.user-data- >>>>> collection+json;version=1.0</value> >>>>> <value>application/vnd.com.healthmedia.user-data+json; >>>>> version=1.0</value> >>>>> </util:list> >>>>> <bean id="jsonProvider" >>>>> class="org.apache.cxf.jaxrs.provider.json.JSONProvider"> >>>>> <property name="unmarshallAsJaxbElement" value="true"/> >>>>> <property name="marshallAsJaxbElement" value="true" /> >>>>> <property name="ignoreNamespaces" value="true"/> >>>>> <property name="produceMediaTypes" ref="jsonTypes"/> >>>>> <property name="consumeMediaTypes" ref="jsonTypes"/> >>>>> </bean> >>>>> >>>>> It SEEMS though that I shouldnt have to jump thorugh hoops to get this >>>>> working. Is there a reason why it shouldnt work out of the box? The >>>>> fact >>>>> that the JSONProvider need to be told about a JAXB implementation >>>>> detail >>>>> seems wrong to me. I also ran into a JSON namespace issue that I had to >>>>> solve as well. >>>>> >>>>> Is there a better way to configure this? >>>>> >>>>> Thanks again, >>>>> >>>>> -Mike >>>>> >>>>> >>>>> On Sun, Jun 8, 2014 at 2:15 PM, Lambert, Michael < >>>>> mich...@michaellambert.com> wrote: >>>>> >>>>> I have written an example service to implement standards I am trying >>>>> to >>>>> >>>>>> stand up where I work. >>>>>> >>>>>> I want to do contract first development and so derive all artifacts >>>>>> from >>>>>> a predefined xml schema and wadl for rest services. >>>>>> >>>>>> The project generates the artifacts and I import those artifacts into >>>>>> an >>>>>> implementation project to write the sample code. I then overrode the >>>>>> media >>>>>> types that the JAXBElementProvider and JSONProvider operate on in my >>>>>> context file (bean.xml). >>>>>> >>>>>> When I attempt to access the implemented service using a curl >>>>>> statement >>>>>> the following error occurs: >>>>>> >>>>>> curl -X GET -H "Accept: >>>>>> application/vnd.com.healthmedia.user-data+json;version=1.0" >>>>>> http://localhost:8080/user-data-service/user-data/11 >>>>>> JAXBException occurred : unable to marshal type >>>>>> "com.healthmedia.ws.entity.userdata.v1.UserDataType" as an element >>>>>> because >>>>>> it is missing an @XmlRootElement annotation. unable to marshal type >>>>>> "com.healthmedia.ws.entity.userdata.v1.UserDataType" as an element >>>>>> because >>>>>> it is missing an @XmlRootElement annotation. >>>>>> >>>>>> I am really stuck can someone help? >>>>>> >>>>>> The sample code is on my github account: >>>>>> >>>>>> https://github.com/MacFlecknoe/service-repository-sample >>>>>> >>>>>> The schemas and wadl are in the schema project ( >>>>>> https://github.com/MacFlecknoe/service-repository-sample/tree/master/ >>>>>> schema), >>>>>> the java artifacts are generated in the artifact project ( >>>>>> https://github.com/MacFlecknoe/service-repository-sample/tree/master/ >>>>>> user-data/artifacts) >>>>>> and the implementation is in the user-data-service project ( >>>>>> https://github.com/MacFlecknoe/service-repository-sample/tree/master/ >>>>>> user-data/service >>>>>> ) >>>>>> >>>>>> Thank you in advance! >>>>>> >>>>>> Michael Lambert >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>> >>> -- >>> Sergey Beryozkin >>> >>> Talend Community Coders >>> http://coders.talend.com/ >>> >>> Blog: http://sberyozkin.blogspot.com >>> >>> >> >