2014-05-13 7 views
5

Próbowałem użyć zboczeńca, aby udokumentować moją obsługę jaxrs-resteasy. Chcę skonfigurować to programowo w osadzonym serwerze serwerowni. Oto moje klasy zasobów, serwerów i aplikacji. Mogę uzyskać dostęp do http://127.0.0.1:9091/rest/hello i sprawdzić, czy moja usługa spoczynku działa, ale gdy próbuję uzyskać dostęp do http://127.0.0.1:9091/rest/api-docs, nie mogę go uruchomić, ale widzę zamiast 404 nie znaleziono. Czy ktoś może wskazać mi, co mogę zrobić źle, konfigurując Swagger.Nie można skonfigurować programu Swagger z wbudowanym pomostem programowo

pliku zasobów

@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(); 
     } 

    } 
} 

plik Usługa

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

Czy kiedykolwiek znalazłeś rozwiązanie? Mam podobny problem, zawsze otrzymuję 404, gdzie według mnie powinny znajdować się informacje o Swaggerze. – medloh

+0

Po prostu zgadnij: Czy poprawnie skonfigurowałeś podstawową ścieżkę w beanConfig? Próbujesz uzyskać dostęp do http: // localhost: 9091/rest/api-docs, ale podstawową ścieżką jest http: // localhost: 9091/api. W mojej klasie bootstrap dla Swagger'a skonfigurowałem również ścieżkę API (taką samą wartość jak basePath), w moim przypadku: ConfigFactory.config(). SetApiPath ("myPath"); – tareq

Odpowiedz

0

wiem, jest to stara sprawa, ale może to komuś pomóc, więc tutaj idzie.

Nie jestem pewien, jakie wersje używasz, ale to pasuje do problemu, z którym spotkałem się więcej niż raz z kilkoma różnymi wersjami Swagger. Jedna rzecz, którą zauważam, to to, że nigdzie nie rejestrujesz klas ApiListingResourceJSON, ani ResourceListingProvider, które pochodzą z Swagger. Te klasy są wymagane w celu dostarczenia zasobu /api-docs/.

Dodatkowo, typowa konfiguracja nie działa dla mnie. Użycie parametru BeanConfig spowodowało tylko pusty element JSON Swagger. Jeśli tak się stanie, rozwiązałem ten problem, tworząc niestandardową konfigurację.

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(); 
     } 

    } 
} 

To nie jest idealne rozwiązanie. Na przykład, jeśli masz zasoby, które nie są zarejestrowane, nadal będą się pojawiać w Swagger, jeśli użyjesz tej niestandardowej konfiguracji Swagger. Doprowadziło mnie to jednak do tego, że swagger faktycznie działał. Mam nadzieję że to pomoże.

Powiązane problemy