Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maven WADL plugin not producing a usable WADL

I am trying to produce a WADL using the maven plugin. The project builds and the service works. Here is the part of the POM with plugin:

             <plugin>
                <groupId>com.sun.jersey.contribs</groupId>
                <artifactId>maven-wadl-plugin</artifactId>
                <version>1.19.2</version>
                <executions>
                    <execution>
                        <id>generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>

                <configuration>
                    <wadlFile>${basedir}/src/main/docs/ThingREST.wadl</wadlFile>
                    <formatWadlFile>true</formatWadlFile>
                    <baseUri>http://localhost:8080/ThingREST</baseUri>
                    <packagesResourceConfig>
                        <param>samp.rest.ws.controller</param>
                    </packagesResourceConfig>
                    <wadlGenerators>
                        <wadlGeneratorDescription>
                            <className>com.sun.jersey.server.wadl.generators.WadlGeneratorApplicationDoc
                            </className>
                            <properties>
                                <property>
                                    <name>applicationDocsFile</name>
                                    <value>${basedir}/src/main/docs/xml/app-wadl-doc.xml</value>
                                </property>
                            </properties>
                        </wadlGeneratorDescription>
                        <wadlGeneratorDescription>
                            <className>com.sun.jersey.server.wadl.generators.WadlGeneratorGrammarsSupport
                            </className>
                            <properties>
                                <property>
                                    <name>grammarsFile</name>
                                    <value>${basedir}/src/main/docs/xml/app-wadl-grammar.xml</value>
                                </property>
                            </properties>
                        </wadlGeneratorDescription>                        
                    </wadlGenerators>
                </configuration>
            </plugin>

The applicationDocFile and grammarFile exist, but they do not contain any significant info. I am not sure what to include.

Here is the controller:

package samp.rest.ws.controller;

import java.util.List;
import samp.rest.ws.ThingDB;
import samp.rest.ws.vo.Thing;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 *
 * @author Grayson
 */
@RestController
public class ThingController {

    @RequestMapping(value = "/things", method = RequestMethod.GET, headers = "Accept=application/json") //produces = "application/json")
    public List<Thing> getThings() {
        return ThingDB.getThings();
    }

    @RequestMapping(value = "/thing/{id}", method = RequestMethod.GET, headers = "Accept=application/json")
    public Thing getThingById(@PathVariable int id) {
        return ThingDB.getThing(id);
    }

    @RequestMapping(value = "/thingy/{id}", method = RequestMethod.GET)
    public String getThingy(@PathVariable int id) {
        return ThingDB.getThing(id).toString();
    }

    @RequestMapping(value = "/addthing", method = RequestMethod.PUT) //, headers = "Accept=application/json")    
    public void addThing(@RequestBody Thing thing) {
        ThingDB.addThing(thing);

        List<Thing> lt = ThingDB.getThings();
        for (Thing t : lt) {
            System.out.println(" Post add: " + t.toString());
        }
    }
}

Finally, here is the WADL produced:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
    <doc
        jersey:generatedBy="Jersey: 1.19.2 08/25/2016 12:00 AM"
        xmlns:jersey="http://jersey.java.net/"/>
    <doc
        title="Maven Spring REST Sample WADL"
        xml:lang="en"><![CDATA[
        This is the Web Application Description Language (WADL) for
        a Maven Spring REST Service. This service is intended to serve as
        a workign model/sample.
    ]]></doc>
    <grammars/>
    <resources base="http://localhost:8080/ThingREST"/>
</application>

I am expecting the WADL to include the available service calls and also identify the input types. Obviously, I am not getting this.

I have searched high and low for examples and documentation to use this plugin. Any and all help would be greatly appreciated. Sadly, what documentation/examples that do exist seem outdated.

Thanks in advance.

like image 265
Grayson Avatar asked Oct 04 '16 18:10

Grayson


People also ask

What is WADL (in Java)?

Gentle introduction to WADL (in Java) In principle WADL is similar to WSDL, but the structure of the language is much different. Whilst WSDL defines a flat list of messages and operations either consuming or producing some of them, WADL emphasizes the hierarchical nature of RESTful web services. In REST, the primary artifact is the resource.

What is wsdldirectory in Maven?

Within our Maven plugin section, the wsdlDirectory configuration property informs the plugin where our WSDL files are located. In this example, we'll tell the plugin to get all WSDL files in our project's src/main/resources directory:

What is the difference between WADL and WSDL?

Whilst WSDL defines a flat list of messages and operations either consuming or producing some of them, WADL emphasizes the hierarchical nature of RESTful web services. In REST, the primary artifact is the resource. Each resource (noun) is represented as an URI.


1 Answers

Unfortunately this plugin does not support Spring REST controllers. It will only process classes annotated with @Path and other JAX-RS annotations. There is no other plugin that does what you need. You have two options:

1) Rewrite your controller to use JAX-RS. For example I changed your controller to the following:

package samp.rest.ws.controller;

import java.util.List;
import samp.rest.ws.ThingDB;
import samp.rest.ws.vo.Thing;

import javax.ws.rs.*;

@Path("/thing")
public class ThingController {

    @GET
    @Path(value = "/things")
    @Produces("application/json")
    public List<Thing> getThings() {
        return ThingDB.getThings();
    }

    @GET
    @Path(value = "/thing/{id}")
    @Produces("application/json")
    public Thing getThingById(@PathParam("id") int id) {
        return ThingDB.getThing(id);
    }

    @GET
    @Path(value = "/thingy/{id}")
    public String getThingy(@PathParam("id") int id) {
        return ThingDB.getThing(id).toString();
    }

    @PUT
    @Path(value = "/addthing")
    @Produces("application/json")
    public void addThing(Thing thing) {
        ThingDB.addThing(thing);

        List<Thing> lt = ThingDB.getThings();
        for (Thing t : lt) {
            System.out.println(" Post add: " + t.toString());
        }
    }
}

Then the plugin produces this WADL file:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
    <doc jersey:generatedBy="Jersey: 1.19.2 08/25/2016 12:00 AM" xmlns:jersey="http://jersey.java.net/"/>
    <doc title="A message in the WADL" xml:lang="en"><![CDATA[This is the Web Application Description Language (WADL) for
        a Maven Spring REST Service. This service is intended to serve as
        a workign model/sample.]]></doc>
    <grammars>
        <include href="xsd0.xsd">
            <doc/>
        </include>
    </grammars>
    <resources base="http://localhost:8080/ThingREST">
        <resource path="/thing">
            <resource path="/things">
                <method id="getThings" name="GET">
                    <response>
                        <representation mediaType="application/json"/>
                    </response>
                </method>
            </resource>
            <resource path="/addthing">
                <method id="addThing" name="PUT">
                    <request>
                        <representation mediaType="*/*"/>
                    </request>
                </method>
            </resource>
            <resource path="/thing/{id}">
                <param name="id" style="template" type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
                <method id="getThingById" name="GET">
                    <response>
                        <representation mediaType="application/json"/>
                    </response>
                </method>
            </resource>
            <resource path="/thingy/{id}">
                <param name="id" style="template" type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
                <method id="getThingy" name="GET">
                    <response>
                        <representation mediaType="*/*"/>
                    </response>
                </method>
            </resource>
        </resource>
    </resources>
</application>

2) Write your own Maven WADL plugin that supports Spring REST controllers. For reference, you can look at this generator in the form of web service:

https://javattitude.com/2014/05/26/wadl-generator-for-spring-rest/

And the source code of Maven WADL plugin:

https://github.com/jersey/jersey-1.x/tree/master/contribs/maven-wadl-plugin

like image 62
Danio Avatar answered Oct 08 '22 23:10

Danio