cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Francesco Chicchiriccò <ilgro...@apache.org>
Subject Re: WADL generation: linkJsonToXmlSchema & XMLName
Date Fri, 18 Oct 2013 08:50:54 GMT
On 17/10/2013 17:55, Sergey Beryozkin wrote:
> Hi Francesco,
>
> the JSON to schema link issue is fixed now, it should actually work 
> with Produces/Consumes containing application/json only, but there was 
> a bug when multiple media types were set.
>
> @XMLName on explicit collections is optional now,
>
> I was not able though to reproduce the issue with a package info being 
> not picked up; the schema is generated in such cases too.

Hi Sergey,
I had to build CXF 2.7.8-SNAPSHOT from sources but then it worked like a 
charm: now JAXB collections are handled correctly, both for JSON and XML 
and additional schema entries are well generated.

> The package of UserTO has no packageinfo, have you added it locally ?

Exactly: at first I thought I could made modifications for RESTful 
documentation with Syncope 1.1.X and then merge to 1.2.X, then I decided 
to work only on latter, in order to not break anything for people 
already using it.

> One other thing to check is whether a complete JAXBContext has even 
> been created, what may've happened is that few types like Response 
> have slipped in which would cause JAXBContext creation to fail, that 
> has been tightened now too,
>
> Please try the snapshots

Thanks for the fixes.

Regards.

> On 15/10/13 16:02, Sergey Beryozkin wrote:
>> Hi
>> On 15/10/13 13:48, Francesco Chicchiriccò wrote:
>>> On 15/10/2013 14:43, Sergey Beryozkin wrote:
>>>> Hi Francesco
>>>> On 15/10/13 13:07, Francesco Chicchiriccò wrote:
>>>>> Hi,
>>>>> I am currently trying to enrich the WADL auto-generated by CXF 
>>>>> 2.7.7 in
>>>>> Syncope.
>>>>>
>>>>> I currently have these Spring beans defined:
>>>>>
>>>>>    <bean id="wadlGenerator"
>>>>> class="org.apache.cxf.jaxrs.model.wadl.WadlGenerator">
>>>>>      <property name="applicationTitle" value="Apache Syncope
>>>>> ${project.version}"/>
>>>>>      <property name="namespacePrefix" value="syncope"/>
>>>>>      <property name="linkJsonToXmlSchema" value="true"/>
>>>>>      <property name="useJaxbContextForQnames" value="true"/>
>>>>>      <property name="ignoreMessageWriters" value="true"/>
>>>>>      <property name="addResourceAndMethodIds" value="true"/>
>>>>>    </bean>
>>>>>
>>>>> and
>>>>>
>>>>>    <jaxrs:server id="restContainer" address="/"
>>>>> staticSubresourceResolution="true">
>>>>>        <!-- snip -->
>>>>>      <jaxrs:providers>
>>>>>        <ref bean="jaxbProvider"/>
>>>>>        <ref bean="jsonProvider"/>
>>>>>        <ref bean="exceptionMapper"/>
>>>>>        <ref bean="wadlGenerator"/>
>>>>>      </jaxrs:providers>
>>>>>    </jaxrs:server>
>>>>>
>>>>> I am currently testing one of available services that now looks as
>>>>> follows (showing only a couple of methods for simplicity):
>>>>>
>>>>> @Path("users")
>>>>> @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>>>> @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
>>>>> public interface UserService {
>>>>>
>>>>>      @GET
>>>>>      @Path("{userId}")
>>>>>      @Descriptions(
>>>>>              @Description(target = DocTarget.METHOD, value = 
>>>>> "Returns a
>>>>> single user matching the provided userId"))
>>>>>      UserTO read(@PathParam("userId") Long userId);
>>>>>
>>>>>
>>>>>      @GET
>>>>>      @XMLName("{http://syncope.apache.org/1.1}users")
>>>>>      List<UserTO> list();
>>>>> }
>>>>>
>>>>> Now, while the former becomes (in the WADL)
>>>>>
>>>>> <method name="GET" id="read">
>>>>>    <doc>Returns a single user matching the provided userId</doc>
>>>>>    <request/>
>>>>>    <response>
>>>>>      <representation mediaType="application/xml"
>>>>> element="syncope1:user"/>
>>>>>      <representation mediaType="application/json"
>>>>> element="syncope1:user"/>
>>>>>    </response>
>>>>> </method>
>>>>>
>>>>> which is just fine, the latter is instead reported as
>>>>>
>>>>> <method name="GET" id="list">
>>>>>    <response>
>>>>>      <representation mediaType="application/xml"
>>>>> element="syncope1:users"/>
>>>>>      <representation mediaType="application/json"
>>>>> element="syncope1:user"/>
>>>>>    </response>
>>>>> </method>
>>>>>
>>>>> As you can see, representation/@element is different between JSON and
>>>>> XML, e.g. for XML the value provided via @XMLName is used, while for
>>>>> JSON it is reported as if the return type was plain 'UserTO' 
>>>>> instead of
>>>>> 'List<UserTO>'.
>>>>
>>>> This is a bug to do with linking JSON reps to XML schemas, I'll have a
>>>> look; I'm actually experimenting with WADL Generator right now anyway
>>>> :-)
>>>
>>> Nice coincidence :-)
>>> If there is any related issue on JIRA, please report.
>>>
>> Sure, https://issues.apache.org/jira/browse/CXF-5336
>>
>> There are few issues there I'd like to address, some of them minor, and
>> I tried to catch major ones in the subject
>>
>>>>> Without @XMLName, element attribute is not even reported for XML.
>>>>>
>>>> Right, I thought that typically we can't be 100% sure what the wrapper
>>>> name is, the default would be XMLRootElement's local name + "s" - but
>>>> it is not guaranteed to be precise; however I think may be we can
>>>> relax it, users can customize with XMLName if the default name
>>>> calculation does not work
>>>
>>> Sounds reasonable.
>>>
>>>>> Moreover, I would expect to find something in the <schema> section
of
>>>>> the WADL for '{http://syncope.apache.org/1.1}users', as [1] seems to
>>>>> suggest.
>>>>>
>>>> has UserTO @XmlRootElement attached to it ?
>>>
>>> Sure:
>>> https://svn.apache.org/repos/asf/syncope/branches/1_1_X/common/src/main/java/org/apache/syncope/common/to/UserTO.java

>>>
>>>
>>>
>>>
>>> In addition to this, I have also defined some package-info.java with
>>> content:
>>>
>>> @XmlSchema(namespace = "http://syncope.apache.org/1.1")
>>> package org.apache.syncope.common.to;
>>>
>>> and put
>>>
>>>      <property name="namespacePrefixes">
>>>        <map>
>>>          <entry key="http://syncope.apache.org/1.1">
>>>            <value>syncope</value>
>>>          </entry>
>>>        </map>
>>>      </property>
>>>
>>> in jaxProvider.
>>>
>> Looks like it misses on the package info in the explicit collections
>> case, though I'm pretty sure it works otherwise.
>> Btw, I'm seeing the issues with the generator adding new XSD elements
>> into the already generated schema, fixed locally already
>>
>> Cheers, Sergey
>>
>> Thanks, Sergey
>>
>>> Regards.
>>>
>>>> Cheers, Sergey
>>>>
>>>>> Any clue?
>>>>> TIA
>>>>>
>>>>> Regards.
>>>>>
>>>>> [1]
>>>>> http://cxf.apache.org/docs/jaxrs-services-description.html#JAXRSServicesDescription-RepresentingexplicitJAXBcollections

>>>>>

-- 
Francesco Chicchiriccò

ASF Member, Apache Syncope PMC chair, Apache Cocoon PMC Member
http://people.apache.org/~ilgrosso/


Mime
View raw message