2014-05-13 11 views
5

Ich habe versucht, prolong zu verwenden, um meinen Jaxrs-Restasy-Dienst zu dokumentieren. Ich möchte dies programmgesteuert in einer eingebetteten Jetty-Server-Einstellung konfigurieren. Hier sind meine Ressourcen-, Server- und Anwendungsklassen. Ich kann auf http://127.0.0.1:9091/rest/hello zugreifen und überprüfen, dass mein Rest Service funktioniert .. aber wenn ich versuche, auf http://127.0.0.1:9091/rest/api-docs zuzugreifen, kann ich es nicht funktionieren, aber sehen Sie stattdessen eine 404 nicht gefunden. Kann mir jemand zeigen, was ich beim Konfigurieren von Swagger falsch machen könnte?Konnte Swagger mit Embedded Jetty programmgesteuert nicht konfigurieren

Ressourcendatei

@Api(value = "/", description = "Index") 
@Path("/") 
public class Index { 

    @GET 
    @ApiOperation(
       value = "call Index", 
       response = Response.class, 
       responseContainer = "Object" 
      ) 
    @Produces("text/html") 
    public Response index() throws URISyntaxException { 
     File f = new File(System.getProperty("user.dir")+"/index.html"); 
     String mt = new MimetypesFileTypeMap().getContentType(f); 
     return Response.ok(f, mt).build(); 
    } 

    @GET 
    @Path("/hello") 
    @ApiOperation(
       value = "hello Get", 
       response = Response.class, 
       responseContainer = "Object" 
      ) 
    public Response helloGet() {  
     return Response.status(200).entity("HTTP GET method called").build(); 
    } 

} 

Server

public class JettyServer { 

    public static void main(String[] args) throws IOException { 

     Server server = new Server(9091); 
     final HandlerList handlers = new HandlerList(); 

     ServletHolder h = new ServletHolder(new HttpServletDispatcher()); 
     h.setInitParameter("javax.ws.rs.Application", "com.all.MyServices"); 

//  h.setInitOrder(1); 

     ServletContextHandler restContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     restContextHandler.setContextPath("/rest"); 
     restContextHandler.addServlet(h, "/*"); 

     handlers.addHandler(restContextHandler); 

     server.setHandler(handlers); 

     try { 
      server.start(); 
      server.join(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

Datei Service

public class MyServices extends Application { 

    private static Set<Index> services = new HashSet<>(); 

    public MyServices() {  

     System.out.println("Initializing Swagger BeanConfig"); 
     BeanConfig beanConfig = new BeanConfig(); 
     beanConfig.setVersion("1.0"); 
     beanConfig.setResourcePackage(Index.class.getPackage().getName()); 
     beanConfig.setBasePath("http://localhost:9091/api"); 
     beanConfig.setDescription("My RESTful services"); 
     beanConfig.setTitle("My RESTful API"); 
     beanConfig.setScan(true); 

     services.add(new Index()); 
    } 

    @SuppressWarnings({ "unchecked", "rawtypes" }) 
    @Override 
    public Set getSingletons() { 
     return services; 
    } 

    @SuppressWarnings("rawtypes") 
    public static Set getServices() { 
     return services; 
    } 
} 
+0

Haben Sie jemals eine Lösung gefunden? Ich habe ein ähnliches Problem, immer eine 404, wo ich denke, dass die Swagger-Info sein sollte. – medloh

+0

Nur eine Vermutung: Haben Sie den Basispfad in Ihrer BeanConfig korrekt konfiguriert? Sie versuchen, auf http: // localhost: 9091/rest/api-docs zuzugreifen, aber Ihr Basispfad ist http: // localhost: 9091/api. In meiner Bootstrap-Klasse für Swagger habe ich auch den API-Pfad (der gleiche Wert wie BasePath) konfiguriert, in meinem Fall: ConfigFactory.config(). SetApiPath ("myPath"); – tareq

Antwort

0

Ich weiß, dass dies eine alte Frage, aber das jemand helfen kann, geht so hier.

Ich bin mir nicht sicher, welche Versionen von dem, was Sie verwenden, aber dies entspricht einem Problem, das ich mehr als einmal mit mehreren verschiedenen Versionen von Swagger begegnet bin. Eine Sache, die ich bemerke, ist, dass Sie nirgendwo die Klassen ApiListingResourceJSON, ApiDeclarationProvider oder ResourceListingProvider registrieren, die mit Swagger kommen. Diese Klassen sind erforderlich, um die Ressource /api-docs/ bereitzustellen.

Außerdem funktionierte typische Konfiguration für mich nicht. Die Verwendung von BeanConfig führte nur zu einem leeren JSON Swagger-Element. In diesem Fall habe ich dieses Problem gelöst, indem ich eine benutzerdefinierte Konfiguration erstellt habe.

public class CustomSwaggerConfig extends HttpServlet { 
    public static final String PACKAGE = "com.shorecg.eureka"; 

    @Override 
    public void init(ServletConfig servletConfig) throws ServletException { 
     super.init(servletConfig); 
     ConfigFactory.setConfig(new WebXMLReader(servletConfig)); 
     ReflectiveJaxrsScanner scanner = new ReflectiveJaxrsScanner(); 
     scanner.setResourcePackage(PACKAGE); 
     ScannerFactory.setScanner(scanner); 
     ClassReaders.setReader(new DefaultJaxrsApiReader()); 
    } 

    class ReflectiveJaxrsScanner implements JaxrsScanner { 
     private String resourcePackage; 

     public String getResourcePackage() { 
      return resourcePackage; 
     } 

     public ReflectiveJaxrsScanner setResourcePackage(String resourcePackage) { 
      this.resourcePackage = resourcePackage; 
      return this; 
     } 

     @Override 
     public List<Class<?>> classes() { 
      Reflections reflections = new Reflections(resourcePackage); 
      Set<Class<?>> clsses = reflections.getTypesAnnotatedWith(Api.class); 
      return JavaConversions.asScalaSet(clsses).toList(); 
     } 

     @Override 
     public List<Class<?>> classesFromContext(Application aplctn, ServletConfig sc) { 
      return classes(); 
     } 

    } 
} 

Dies ist keine perfekte Lösung. Wenn Sie beispielsweise Ressourcen haben, die nicht registriert sind, werden sie trotzdem in Swagger angezeigt, wenn Sie diese benutzerdefinierte Swagger-Konfiguration verwenden. Es brachte mich jedoch zu dem Punkt, an dem der Swagger tatsächlich arbeitete. Hoffe das hilft.

Verwandte Themen