4 Stimmen

Nicht in der Lage, Swagger programmatisch mit dem eingebetteten Jetty zu konfigurieren

Ich habe versucht, Swagger zu verwenden, um meinen JAX-RS-Resteasy-Service zu dokumentieren. Ich möchte dies programmgesteuert in einer eingebetteten Jetty-Serverumgebung konfigurieren. Hier sind meine Resource-, Server- und Application-Klassen. Ich kann auf http://127.0.0.1:9091/rest/hello zugreifen und überprüfen, dass mein Rest-Dienst funktioniert.. aber wenn ich auf http://127.0.0.1:9091/rest/api-docs zugreifen möchte, funktioniert es nicht, sondern zeigt stattdessen eine 404-Seite nicht gefunden an. Kann mir jemand sagen, was ich falsch machen könnte, während ich Swagger konfiguriere.

Resource-Datei

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

    @GET
    @ApiOperation(
                value = "Index aufrufen",
                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 = "Hallo Get",
                response = Response.class,
                responseContainer = "Object"
            )
    public Response  helloGet() {     
        return Response.status(200).entity("HTTP GET-Methode aufgerufen").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();
        }

    }
}

Servicedatei

public class MyServices extends Application  {

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

    public  MyServices() {     

        System.out.println( "Initialisiere Swagger BeanConfig" );
        BeanConfig beanConfig = new BeanConfig();
        beanConfig.setVersion("1.0");
        beanConfig.setResourcePackage( Index.class.getPackage().getName() );
        beanConfig.setBasePath( "http://localhost:9091/api" );
        beanConfig.setDescription( "Meine RESTful-Services" );
        beanConfig.setTitle( "Meine 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;
    } 
}

0voto

ironhardchaw Punkte 149

Ich weiß, dass dies eine alte Frage ist, aber das könnte jemandem helfen, also los geht's.

Ich bin mir nicht sicher, welche Versionen von was du verwendest, aber dies entspricht einem Problem, dem ich mehr als einmal bei verschiedenen Versionen von Swagger begegnet bin. Eines fällt mir auf: Nirgendwo registrieren Sie die Klassen ApiListingResourceJSON, ApiDeclarationProvider oder ResourceListingProvider, die mit Swagger geliefert werden. Diese Klassen sind erforderlich, um die Ressource /api-docs/ bereitzustellen.

Zusätzlich hat die typische Konfiguration bei mir nicht funktioniert. Die Verwendung von BeanConfig führte nur zu einem leeren JSON Swagger-Element. Falls dies geschieht, habe ich dieses Problem durch die Erstellung einer benutzerdefinierten Konfiguration gelöst.

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> classes() {
            Reflections reflections = new Reflections(resourcePackage);
            Set> clsses = reflections.getTypesAnnotatedWith(Api.class);
            return JavaConversions.asScalaSet(clsses).toList();
        }

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

    }
}

Dies ist keine perfekte Lösung. Wenn zum Beispiel Ressourcen nicht registriert sind, erscheinen sie immer noch in Swagger, wenn du diese benutzerdefinierte Swagger-Konfiguration verwendest. Es hat mich jedoch dazu gebracht, dass Swagger tatsächlich funktioniert hat. Hoffentlich hilft das.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X