[英]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在沒有web.xml
或Spring的情況下與嵌入式Jetty一起工作,最終得到了以下解決方案: https : //github.com/SriramKeerthi/swagger-jersey2-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
端點上看到Swagger spec
。
PS irc.freenode.net上#swagger的團隊非常聰明,如果沒有解決,請訪問他們。
如果您使用的是swagger-core 1.5.x,則需要在/swagger.json
的上下文路徑下/swagger.json
。 因此,對於您的設置:
http://localhost:9000/apitest/api-docs/swagger.json
在找到解決方案之前,我被困了幾個小時。 盡管我的配置與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" );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.