在Spring MVC应用程序中实现Swagger的“简单”方法
我有一个简单的Spring写的ReSTFul API(没有Spring Boot,没有花哨的东西!)。 我需要实现Swagger。 到目前为止,互联网上的每一个页面都让我疯狂,因为混乱的configuration和臃肿的代码,我根本找不到可移植的代码。
有没有人有一个示例项目(或一组详细的步骤),可以帮助我做到这一点? 特别是,我正在寻找一个使用swagger-springmvc的好样本。 我知道它有'样品',但最好的是,深奥的代码是令人沮丧的。
我必须澄清,我不是在寻找“为什么Swagger是最好的”。 我不使用(而对于我目前的任务不会使用)Spring Boot还是这样的。
Springfox(Swagger spec 2.0,当前版本)
Springfox已经取代了Swagger-SpringMVC,现在支持Swagger 1.2和2.0两个版本。 实现类已经改变,允许一些更深的定制,但有一些工作。 文档已经改进,但仍需要为高级configuration添加一些细节。 1.2的实现的旧答案仍然可以在下面find。
Maven依赖
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.5.0</version> </dependency>
最小的实现看起来差不多,但现在使用Docket
类而不是SwaggerSpringMvcPlugin
类:
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api(){ return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.regex("/api/.*")) .build() .apiInfo(apiInfo()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("TITLE") .description("DESCRIPTION") .version("VERSION") .termsOfServiceUrl("http://terms-of-services.url") .license("LICENSE") .licenseUrl("http://url-to-license.com") .build(); } }
您的Swagger 2.0 API文档现在将在http://myapp/v2/api-docs
。
现在添加Swagger UI支持更容易。 如果您正在使用Maven,请为Swagger UI webjar添加以下依赖项:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.5.0</version> </dependency>
如果您使用的是Spring Boot,那么您的Web应用程序应该自动获取必要的文件,并在http://myapp/swagger-ui.html
(以前称为: http://myapp/springfox
)中显示UI。 如果你没有使用Spring Boot,那么就像在下面的答案中提到的那样,你需要为这些文件注册一个资源处理器。 Javaconfiguration看起来像这样:
@Configuration @EnableWebMvc public class WebAppConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } }
新的静态文档生成function也看起来不错,虽然我没有尝试过自己。
Swagger-SpringMVC(Swagger spec 1.2,旧)
Swagger-SpringMVC的文档可能有点混乱,但实际上设置起来非常简单。 最简单的configuration需要创build一个SpringSwaggerConfig
bean并启用基于注解的configuration(您可能已经在您的Spring MVC项目中做过):
<mvc:annotation-driven/> <bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" />
不过,我认为使用SwaggerSpringMvcPlugin
而不是以前的XML定义的bean来额外定义Swaggerconfiguration是非常值得的:
@Configuration @EnableSwagger @EnableWebMvc public class SwaggerConfig { private SpringSwaggerConfig springSwaggerConfig; @SuppressWarnings("SpringJavaAutowiringInspection") @Autowired public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) { this.springSwaggerConfig = springSwaggerConfig; } @Bean public SwaggerSpringMvcPlugin customImplementation(){ return new SwaggerSpringMvcPlugin(this.springSwaggerConfig) .apiInfo(apiInfo()) .includePatterns(".*api.*"); // assuming the API lives at something like http://myapp/api } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("TITLE") .description("DESCRIPTION") .version("VERSION") .termsOfServiceUrl("http://terms-of-services.url") .license("LICENSE") .licenseUrl("http://url-to-license.com") .build(); } }
当你运行你的应用程序时,你现在应该看到在http://myapp/api-docs
创build的API规范。 为了使Swagger的UI设置起来,你需要克隆GitHub项目中的静态文件,并把它们放到你的项目中。 确保您的项目configuration为提供静态HTML文件:
<mvc:resources mapping="*.html" location="/" />
然后编辑Swagger UI dist
目录顶层的index.html
文件。 接近文件顶部,您会看到一些引用另一个项目的api-docs
URL的JavaScript。 编辑这个指向你的项目的Swagger文档:
if (url && url.length > 1) { url = url[1]; } else { url = "http://myapp/api-docs"; }
现在,当您导航到http://myapp/path/to/swagger/index.html
,您应该会看到项目的Swagger UI实例。
在添加WebJar依赖和资源映射后,Springfox Swagger UI对我有用。 http://www.webjars.org/documentation#springmvc
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>3.3.5</version> </dependency>
为spring-servlet.xml:
<mvc:resources mapping="swagger-ui.html" location="classpath:/META-INF/resources/"/> <mvc:resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/"/>
或者Spring Annotation https://github.com/springfox/springfox-demos/blob/master/spring-java-swagger/src/main/java/springfoxdemo/java/swagger/SpringConfig.java
Swagger2应该被启用
@EnableSwagger2 public class SwaggerConfiguration { }
你也可以考虑使用swagger-maven-plugin生成swagger.json并将其复制到你的静态swagger-ui中。
请查看此回购的Spring MVC注释的简单工作插件示例:
https://github.com/khipis/swagger-maven-example
或者JAX-RS