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
>>>
>>>
>>
>

Reply via email to