cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Lambert, Michael" <mich...@michaellambert.com>
Subject Re: marshalling issues
Date Mon, 09 Jun 2014 11:42:28 GMT
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. 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).

Again, I am very grateful for you work and your prompt response.

-Mike


On Mon, Jun 9, 2014 at 5:53 AM, Sergey Beryozkin <sberyozkin@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 <
>> michael@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 <
>>> michael@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
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message