2016-07-14 12 views
0

Ich versuche Swagger in mein Jersey-Anwendung zu integrieren im Anschluss an die Führung sie bieten: https://github.com/swagger-api/swagger-core/wiki/Swagger-Core-Jersey-1.X-Project-Setup-1.5Swagger ApiListingResource wird nicht als gültige Ressource anerkannt

Ich verwende v1.17 Jersy und ich bin mit einer benutzerdefinierten Anwendung eher als web.xml

Das folgende ist alles, was ich in meinem einfachen Testprojekt habe, das scheitert!

public class ResConfig extends DefaultResourceConfig { // custom app 
    public ResConfig() { 
     super(); 
     BeanConfig beanConfig = new BeanConfig(); 
     beanConfig.setVersion("1.0.2"); 
     beanConfig.setSchemes(new String[] { "http" }); 
     beanConfig.setHost("localhost:9998"); 
     beanConfig.setBasePath("/api"); 
     beanConfig.setResourcePackage("test.resources"); // the package containing my resource 
     beanConfig.setScan(true); 
    } 
} 

Die einfache Ressource Ich habe

@Path("hello") 
@Produces("application/json") 
public class Res { 
    public Res() { 
    } 


    @GET 
    public Response getHello() { 
     Result result = new Result(); // Result is annotated with XmlRootElement and contains one field String str; 
     result.setStr("hello"); 
     return Response.status(Status.OK).entity(result).build(); 
    } 
} 

Der Haupt:

public static void main(String[] args) throws Exception { 
    ResConfig resConfig = new ResConfig(); 

    resConfig.getClasses().add(Res.class); 
    resConfig.getClasses().add(io.swagger.jaxrs.listing.ApiListingResource.class); 
    resConfig.getClasses().add(io.swagger.jaxrs.listing.SwaggerSerializers.class); 

    GrizzlyServerFactory.createHttpServer("http://localhost:9998/", resConfig); 

    System.in.read(); 
} 

das POM enthält folgende Komponenten:

<dependencies> 
    <dependency> 
     <groupId>io.swagger</groupId> 
     <artifactId>swagger-jersey-jaxrs</artifactId> 
     <version>1.5.9</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-core</artifactId> 
     <version>${jersey-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-json</artifactId> 
     <version>${jersey-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-servlet</artifactId> 
     <version>${jersey-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-server</artifactId> 
     <version>${jersey-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey.contribs</groupId> 
     <artifactId>jersey-multipart</artifactId> 
     <version>${jersey-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-grizzly2</artifactId> 
     <version>${jersey-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
    </dependency> 
</dependencies> 

Der Jersey Grizzly-Server beim Start nicht durch Wurf Ausnahme:

SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
    SEVERE: Missing dependency for method public javax.ws.rs.core.Response io.swagger.jaxrs.listing.ApiListingResource.getListing(javax.ws.rs.core.Application,javax.servlet.ServletConfig,javax.ws.rs.core.HttpHeaders,javax.ws.rs.core.UriInfo,java.lang.String) at parameter at index 1 
    SEVERE: Method, public javax.ws.rs.core.Response io.swagger.jaxrs.listing.ApiListingResource.getListing(javax.ws.rs.core.Application,javax.servlet.ServletConfig,javax.ws.rs.core.HttpHeaders,javax.ws.rs.core.UriInfo,java.lang.String), annotated with GET of resource, class io.swagger.jaxrs.listing.ApiListingResource, is not recognized as valid resource method. 
    SEVERE: Missing dependency for field: javax.servlet.ServletContext io.swagger.jaxrs.listing.ApiListingResource.context 
Exception in thread "main" com.sun.jersey.spi.inject.Errors$ErrorMessagesException 
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170) 
    at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136) 
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:795) 
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:172) 
    at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:134) 
    at com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory.createHttpServer(GrizzlyServerFactory.java:243) 
    at com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory.createHttpServer(GrizzlyServerFactory.java:137) 

Ich suchte die ersten 2 Seiten von Google nach einer Antwort, aber nichts half!

Antwort

0

Swagger verwendet Servlet-APIs, daher muss die Anwendung in einer Servlet-Umgebung ausgeführt werden. Die Art, wie Sie Grizzly konfigurieren, bewirkt, dass nicht einen Servlet-Container einrichten. Es ist nur ein HTTP-Server.

Sie wollen stattdessen die jersey-grizzly2-servlet Abhängigkeit verwenden, und verwenden Sie die GrizzlyWebContainerFactory die Anwendung Bootstrap. Dadurch wird ein Servlet-Container eingerichtet.

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-grizzly2-servlet</artifactId> 
    <version>1.19.1</version> 
</dependency> 

Map<String, String> initParams = new HashMap<>(); 
initParams.put("javax.ws.rs.Application", "com.package.ResConfig"); 
GrizzlyWebContainerFactory.create(uri, initParams); 
+0

auch jetzt der Fehler enthält auch eine Klasse in Swagger: 'mit GET der Ressourcen kommentierten, Klasse io.swagger.jaxrs.listing.AcceptHeaderApiListingResource wird als gültige Ressource method' nicht erkannt –