无法以编程方式配置带有嵌入式jetty的Swagger

时间:2014-05-13 20:03:01

标签: rest jax-rs embedded-jetty swagger

我一直在尝试使用招摇来记录我的jaxrs-resteasy服务。我想在嵌入式jetty服务器设置中以编程方式配置它。这是我的资源,服务器和应用程序类。 我可以访问http://127.0.0.1:9091/rest/hello并验证我的其余服务是否正常工作..但是当我尝试访问http://127.0.0.1:9091/rest/api-docs时,我无法使其正常工作,但看到404找不到。 有人可以指出我在配置Swagger时可能出错的地方。

资源文件

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

}

服务器

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

    }
}

服务档案

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

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但这可能对某人有所帮助,所以这里就是。

我不确定您使用的是什么版本的版本,但这与我在Swagger的几个不同版本中不止一次遇到过的问题相符。我注意到的一件事是,您无处注册Swagger附带的ApiListingResourceJSONApiDeclarationProviderResourceListingProvider类。这些类是提供/api-docs/资源所必需的。

此外,典型配置对我不起作用。使用BeanConfig只会产生一个空的JSON Swagger元素。如果发生这种情况,我通过创建自定义配置解决了这个问题。

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

    }
}

这不是一个完美的解决方案。例如,如果您有未注册的资源,如果您使用此自定义swagger配置,它们仍将显示在Swagger中。然而,它确实让我觉得招摇真的有效。希望这会有所帮助。