Java 带嵌入式码头的昂首阔步

Java 带嵌入式码头的昂首阔步,java,swagger,embedded-jetty,Java,Swagger,Embedded Jetty,有人能告诉我这是否是正确的方式来配置与嵌入式码头招摇 public class TestMain { public static void main(String[] args) throws Exception { Server gs = new Server(); ServletContextHandler sch = gs.getServletContextHandler(); sch.addFilter(new FilterHolder(new Request

有人能告诉我这是否是正确的方式来配置与嵌入式码头招摇

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

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


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

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


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

为了让swagger在没有web.xml或Spring的情况下使用嵌入式Jetty,我做了很多尝试,最终得到了以下解决方案:

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

  • 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");
    
  • 加:

    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
    端点处看到招摇过市


    另外,irc.freenode.net上的#swagger团队非常出色,如果没有任何问题得到解决,你应该去拜访他们。

    为了让swagger使用嵌入式Jetty,我花了很多时间,没有
    web.xml
    或Spring,最后得到了这个解决方案:

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

  • 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");
    
  • 加:

    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
    端点处看到招摇过市


    另外,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);    
    
    编辑 如果希望配置诸如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" );
    

    我被困了好几个小时才找到解决办法。虽然我的配置与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);    
    
    编辑 如果希望配置诸如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" );
    

    我可以让它工作,但请让我知道如何手动生成single swagger.json。我得到了多个API的多个json文件。这正常吗?嗨,如果你能分享更多信息,我很乐意帮忙。最好在Google小组中讨论一下,我发现有一个顶级json包含API条目。i、 例如,swagger.json文件。我正在使用pom.xml中的Swagger插件生成jsonI,我可以让它工作,但是请告诉我如何手动生成单个Swagger.json。我得到了多个API的多个json文件。这正常吗?嗨,如果你能分享更多信息,我很乐意帮忙。最好在Google小组中讨论一下,我发现有一个顶级json包含API条目。i、 例如,swagger.json文件。我在pom.xml中使用Swagger插件生成JSONWonder链接:它可以工作:)这是我遇到的最好的例子之一。谢谢你。不过,我确实有一个问题。参考资料下的swaggerui文件夹,你是如何得到这个的?这是您创建的还是您遇到的某个默认的swagger UI文件夹?@siddhusingh但github使用JAXR。如果我使用的是Jakarta EE 9 big bang的一部分jetty 11,我认为jaxrs.*的所有名称空间都是无用的。你知道我们是否可以用Sriram的链接来连接jetty 11吗?很好的链接:它很有效:)这是我遇到的最好的例子之一。谢谢你。不过,我确实有一个问题。参考资料下的swaggerui文件夹,你是如何得到这个的?这是您创建的还是您遇到的某个默认的swagger UI文件夹?@siddhusingh但github使用JAXR。如果我使用的是Jakarta EE 9 big bang的一部分jetty 11,我认为jaxrs.*的所有名称空间都是无用的。你知道11号码头是否可以使用斯里拉姆的链接吗?