2015-12-01 1 views
4

J'essaie de permettre à Swagger de générer automatiquement la documentation de mes API REST, mais je n'obtiens qu'un résultat partiel.Swagger ne génère pas la documentation REST

J'utilise Resteasy. J'ai ajouté la dépendance Swagger Maven

<dependency> 
    <groupId>io.swagger</groupId> 
    <artifactId>swagger-jaxrs</artifactId> 
    <version>1.5.3</version> 
</dependency> 

Je configuré mon objet Application

package com.myapp.init; 


import java.util.HashSet; 
import java.util.Set; 

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 

import io.swagger.jaxrs.config.BeanConfig; 
import io.swagger.jaxrs.listing.ApiListingResource; 
import io.swagger.jaxrs.listing.SwaggerSerializers; 


@ApplicationPath("/rest") 
public class WebappInit extends Application { 

    public WebappInit() { 
     BeanConfig beanConfig = new BeanConfig(); 
     beanConfig.setVersion("1.0.0"); 
     beanConfig.setSchemes(new String[]{"http"}); 
     beanConfig.setHost("theIP:8080"); 
     beanConfig.setBasePath("/myapp/rest/"); 
     beanConfig.setResourcePackage("the.resource.package"); 
     beanConfig.setScan(true); 
     beanConfig.setPrettyPrint(true); 

    } 


    public Set<Class<?>> getClasses() { 
     Set<Class<?>> s = new HashSet<Class<?>>(); 


     // here I add my REST WSs 
     s.add(ApiListingResource.class); 
     s.add(SwaggerSerializers.class); 


     return s; 
    } 

} 

J'exécuter l'application Web (sur un serveur wildfly 9) et aller à l'URL http://localhost:8080/myapp/rest/swagger.json. Voilà ce que je reçois

{ 
    swagger: "2.0", 
    info: { 
    version: "1.0.0" 
    }, 
    host: "10.17.36.215:8080", 
    basePath: "/devops/rest/", 
    schemes: [ 
    "http" 
    ] 
} 

Il semble que Swagger ne peut pas construire la documentation REST, même si mes points d'extrémité REST sont accessibles et sont ajoutés à la liste de Swagger des ressources.

Quel peut être le problème?

Merci

Giulio

Mise à jour: J'ai vérifié que dans la méthode init Swagger BeanConfig.classes() mes cours REST sont découverts correctement.

+0

Qu'est-ce que vous attendez de voir dans votre fanfaronnades doc? Autant que je peux voir votre classe 'WebappInit' n'a aucune méthode marquée avec des annotations de JAXRS. – AlexR

+0

Je m'attends à voir la liste de mes services REST avec les données utiles (méthodes HTTP, points de terminaison, corps de requête et de réponse) pour les utiliser. Que voulez-vous dire par "Dans la mesure où je peux voir votre classe WebappInit n'a aucune méthode marquée avec des annotations JAXRS"? Dans ma méthode WebappInit.getClasses(), j'ajoute la classe de services REST. Est-ce pas assez? – gvdm

+0

Personnellement, je n'ai jamais vu une telle technique. Je crois que cela fonctionne pour vous, mais je ne comprends pas comment. Comment appelez-vous par exemple votre service 'ApiListingResource'? En utilisant une URL comme '/ rest/listing'? – AlexR

Répondre

5

Vous devez ajouter une annotation @Api à vos classes de ressources.

Par exemple:

package my.sample; 
import io.swagger.annotations.Api; 
import javax.ws.rs.Path; 
import javax.ws.rs.GET; 
import javax.ws.rs.core.Response; 

@Api 
@Path ("/mypath") 
public class MyResource 
{ 
    @GET 
    public Response myEndpoint() 
    { 
     return Response.ok(); 
    } 
} 
0

Je crois que j'ai eu votre problème. Votre service racine étend Application qui permet la construction dynamique de votre hiérarchie de ressources. Je crois que swagger ne peut même pas supporter cette technique car elle génère ses métadonnées (fichiers json) au moment de la compilation.

J'utilise toujours des services REST basés sur des annotations, c'est-à-dire que chaque ressource est annotée avec l'annotation @Path appropriée. Le framework initialise automatiquement toutes les ressources, donc je n'ai pas besoin d'étendre ma ressource racine de Application et d'implémenter getClasses(). Dans ce cas fanfaronnades peut extraire toutes vos ressources et générer des fichiers JSON au moment de la compilation en analysant des annotations JAXRS comme @Path, @PathParam, @GET, @POST etc.

+0

J'annote mes classes REST avec @Path et les autres annotations JAX-RS mais si je n'ajoute pas les classes dans la méthode WebappInit.getClasses(), elles ne sont pas découvertes – gvdm

0

Vous devez ajouter une annotation @App à votre classe de ressources et charger la ressource package dans la méthode setResourcePackage. Ca devrait faire la magie.

+0

L'annotation correcte est en fait @Api. –