【问题标题】:Swagger with embedded Jetty带有嵌入式 Jetty 的 Swagger
【发布时间】:2015-08-13 10:32:32
【问题描述】:

有人可以告诉我这是否是使用嵌入式码头配置 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的讨论

【问题讨论】:

    标签: java swagger embedded-jetty


    【解决方案1】:

    为了让 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

    附: irc.freenode.net 上#swagger 的团队非常出色,如果没有任何问题,您应该访问他们。

    【讨论】:

    • 很棒的链接:github.com/SriramKeerthi/swagger-jersey2-jetty 它有效:)
    • 这是我遇到的最好的例子之一。向你致敬。不过,我确实对此有疑问。 Resources下的swaggerui文件夹,你是怎么来的?这是您创建的东西还是您遇到的一些默认的招摇 UI 文件夹?
    • @siddhusingh 但 github 使用 jaxrs。如果我使用的是 Jakarta EE 9 big bang 中的 jetty 11,我认为 jaxrs.* 的所有命名空间都将毫无用处。你知道我们是否可以使用 Sriram 的 11 号码头链接?
    【解决方案2】:

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

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

    【讨论】:

    • 我可以让它工作,但请告诉我如何手动生成单个 swagger.json。我正在为多个 api 获取多个 json 文件。正常吗?
    • 您好,如果您能提供更多信息,我们很乐意为您提供帮助。最好在 Google Group groups.google.com/forum/#!forum/swagger-swaggersocket 中讨论
    • 我发现有一个顶级 json 包含 api 条目。即 swagger.json 文件。我在 pom.xml 中使用 Swagger 插件来生成 json
    【解决方案3】:

    在找到解决方案之前,我被困了好几个小时。尽管我的配置与 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" );
    

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 2015-02-25
      • 1970-01-01
      • 2011-12-30
      • 2012-02-11
      • 2020-01-24
      • 2012-12-06
      • 2015-09-26
      • 2015-03-27
      相关资源
      最近更新 更多