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/

Reply via email to