带有嵌入式 Jetty 的 Swagger

Swagger with embedded Jetty

有人可以告诉我这是否是使用嵌入式码头配置 Swagger 的正确方法。

public class TestMain {

public static void main(String[] args) throws Exception {
    Server gs = new Server();
    ServletContextHandler sch = gs.getServletContextHandler();

    sch.addFilter(new FilterHolder(new RequestTrackerFilter()), "/*",     EnumSet.of(DispatcherType.REQUEST));
    sch.addFilter(new FilterHolder(new ActionIdFilter()), "/*", EnumSet.of(DispatcherType.REQUEST));

    ResourceHandler resource_handler = new ResourceHandler();
    resource_handler.setDirectoriesListed(false);

    resource_handler.setResourceBase("public/2.0");

    ContextHandler context = new ContextHandler("/apitest");

    context.setHandler(resource_handler);

    ContextHandlerCollection contexts = new ContextHandlerCollection();


   setupSwaggerContextHandler();

  //     context.getServletContext().addListener(new SwaggerInitializer());

    contexts.setHandlers(new Handler[]{sch, context});

    gs.getServer().setHandler(contexts);

    gs.start();
}

private static ServletContextHandler setupSwaggerContextHandler() {
    // Configure Swagger-core
    final ServletHolder swaggerServletHolder = new ServletHolder(new JerseyJaxrsConfig());
    swaggerServletHolder.setName("JerseyJaxrsConfig");
    swaggerServletHolder.setInitParameter("api.version", "1.0.0");
    swaggerServletHolder.setInitParameter("swagger.api.basepath", "http://localhost:9000/apitest");
    swaggerServletHolder.setInitOrder(2);

    final ServletContextHandler swaggerContextHandler = new ServletContextHandler();
    swaggerContextHandler.setSessionHandler(new SessionHandler());
    // Bind Swagger-core to the url HOST/api-docs
    swaggerContextHandler.setContextPath("/api-docs");
    swaggerContextHandler.addServlet(swaggerServletHolder, "/*");

    return swaggerContextHandler;
  }
}

我无法使用

看到任何输出
  http://localhost:9000/apitest/api-docs

正在关注 https://groups.google.com/forum/#!topic/swagger-swaggersocket/KHYESESD6c4

上的讨论

如果您使用的是 swagger-core 1.5.x,您需要在上下文路径下查找 /swagger.json。因此对于您的设置:

http://localhost:9000/apitest/api-docs/swagger.json

为了让 Swagger 在没有 web.xml 或 Spring 的情况下与嵌入式 Jetty 一起工作,我做了很多尝试,最后得到了这个解决方案: https://github.com/SriramKeerthi/swagger-jersey2-jetty

如果我有足够的声誉,我会把它添加为评论。但这是我能想到的最简单的代码版本。您需要两个部分:

  1. Swagger Bean 配置:

    BeanConfig beanConfig = new BeanConfig();
    beanConfig.setVersion("1.0.0");
    beanConfig.setResourcePackage(YourJerseyResourceClass.class.getPackage().getName());
    beanConfig.setScan(true);
    beanConfig.setBasePath("/");
    beanConfig.setDescription("Sample API to demonstrate Swagger with Jersey2" +
            " in an embedded Jetty instance, with no web.xml or Spring MVC.");
    beanConfig.setTitle("Sample API");
    
  2. 添加:

    ResourceConfig resourceConfig = new ResourceConfig();
    // Add your resources and Swagger resources (ApiListingResource package)
    resourceConfig.packages(YourJerseyResourceClass.class.getPackage().getName(), ApiListingResource.class.getPackage().getName());
    ServletContainer servletContainer = new ServletContainer(resourceConfig);
    ServletHolder servletHolder = new ServletHolder(servletContainer);
    ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
    servletContextHandler.setContextPath("/");
    servletContextHandler.addServlet(servletHolder, "/*");
    

您现在应该能够在 /swagger.json 端点看到 Swagger spec

P.S。 irc.freenode.net 上#swagger 的团队非常出色,如果没有解决问题,您应该访问他们。

在找到解决方案之前,我被困了几个小时。尽管我的配置与 OP 略有不同,但在此处添加它。对于我的情况,我只需要将几行配置插入到我的嵌入式 Jetty 和 RestService

// Jetty configuration

// ContextHandlerCollection contexts

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/api");
context.addFilter(GzipFilter.class, "/*", EnumSet.allOf(DispatcherType.class));

ResourceConfig resourceConfig = new ResourceConfig(ImmutableSet.<Class<?>>builder()
                                                                .add(MyRestService.class)
                                                                .build());
// BELOW LINE WAS THE ONLY THING IN JETTY THAT WAS NEEDED               
resourceConfig.packages( ApiListingResource.class.getPackage().getName() );

context.addServlet(new ServletHolder(new ServletContainer(resourceConfig)), "/*");
contexts.addHandler(context);    

关于其余服务,我必须添加:

@Api(value = "MyRestService")
public class MyRestService
{
    @ApiOperation(notes = "Get object api", value = "Get objects")
    public Response getObjects() {....}

}

编辑 如果你想配置像basepath这样的swagger属性,你可以使用自包含的BeanConfig进行配置:

BeanConfig beanConfig = new BeanConfig();
        beanConfig.setVersion( "1.0.0" );
        beanConfig.setResourcePackage( SalusRestService.class.getPackage().getName() );
        beanConfig.setScan( true );
        beanConfig.setBasePath( "/api/v1" );
        beanConfig.setDescription( "Entity Browser API to demonstrate Swagger with Jersey2 in an " + "embedded Jetty instance, with no web.xml or Spring MVC." );
        beanConfig.setTitle( "Entity Browser" );