Tengo una API ReSTFul escrita en Spring simple (¡sin Spring Boot, sin cosas elegantes!). Necesito implementar Swagger en esto. Hasta ahora, CADA página de Internet solo me ha vuelto loco con configuraciones confusas y código inflado que no encontré portátil en absoluto.
¿Alguien tiene un proyecto de muestra (o un conjunto de pasos detallados) que pueda ayudarme a lograr esto? En particular, estoy buscando una buena muestra que use swagger-springmvc. Sé que tiene "muestras", pero en el mejor de los casos, el código esotérico es desalentador.
Debo aclarar que no estoy buscando "por qué Swagger es simplemente el mejor". No estoy usando (y para mi tarea actual no usaré) Spring Boot o tal.
spring
spring-mvc
swagger
wavicle
fuente
fuente
Respuestas:
Springfox (Swagger spec 2.0, actual)
Springfox ha reemplazado a Swagger-SpringMVC y ahora es compatible con las especificaciones 1.2 y 2.0 de Swagger. Las clases de implementación han cambiado, lo que permite una personalización más profunda, pero con algo de trabajo. La documentación ha mejorado, pero aún es necesario agregar algunos detalles para la configuración avanzada. La respuesta anterior para la implementación 1.2 todavía se puede encontrar a continuación.
Dependencia de Maven
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.5.0</version> </dependency>
La implementación mínima se ve más o menos igual, pero ahora usa la
Docket
clase en lugar de laSwaggerSpringMvcPlugin
clase:@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(); } }
La documentación de la API de Swagger 2.0 ahora estará disponible en
http://myapp/v2/api-docs
.Agregar la compatibilidad con la interfaz de usuario de Swagger es aún más fácil ahora. Si está utilizando Maven, agregue la siguiente dependencia para el webjar de la interfaz de usuario de Swagger:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.5.0</version> </dependency>
Si está utilizando Spring Boot, su aplicación web debería recoger automáticamente los archivos necesarios y mostrar la interfaz de usuario en
http://myapp/swagger-ui.html
(anteriormente:)http://myapp/springfox
. Si no está utilizando Spring Boot, como menciona yuriy-tumakha en la respuesta a continuación, deberá registrar un controlador de recursos para los archivos. La configuración de Java se ve así:@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/"); } }
La nueva función de generación de documentación estática también se ve bastante bien, aunque no la he probado yo mismo.
Swagger-SpringMVC (Swagger spec 1.2, anterior)
La documentación de Swagger-SpringMVC puede ser un poco confusa, pero en realidad es increíblemente fácil de configurar. La configuración más simple requiere crear un
SpringSwaggerConfig
bean y habilitar la configuración basada en anotaciones (lo que probablemente ya haga en su proyecto Spring MVC):<mvc:annotation-driven/> <bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" />
Sin embargo, creo que vale la pena dar el paso adicional de definir una configuración Swagger personalizada usando
SwaggerSpringMvcPlugin
, en lugar del bean anterior definido por XML:@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(); } }
Cuando ejecute su aplicación, ahora debería ver su especificación de API creada en
http://myapp/api-docs
. Para configurar la elegante interfaz de usuario de Swagger, debe clonar los archivos estáticos del proyecto GitHub y ponerlos en su proyecto. Asegúrese de que su proyecto esté configurado para entregar archivos HTML estáticos:<mvc:resources mapping="*.html" location="/" />
Luego edite el
index.html
archivo en el nivel superior deldist
directorio de la IU de Swagger . Hacia la parte superior del archivo, verá algo de JavaScript que se refiere a laapi-docs
URL de otro proyecto. Edite esto para que apunte a la documentación Swagger de su proyecto:if (url && url.length > 1) { url = url[1]; } else { url = "http://myapp/api-docs"; }
Ahora, cuando navegue hacia
http://myapp/path/to/swagger/index.html
, debería ver la instancia de la IU de Swagger para su proyecto.fuente
PathSelectors.
para ayudar a las personas que luchan con la importación estática deregex
2.5.0
mientras escribo esto)La interfaz de usuario de Springfox Swagger me funciona después de agregar la dependencia de WebJar y las asignaciones de recursos. 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/"/>
o anotación de primavera https://github.com/springfox/springfox-demos/blob/master/spring-java-swagger/src/main/java/springfoxdemo/java/swagger/SpringConfig.java
Swagger2 debería estar habilitado
@EnableSwagger2 public class SwaggerConfiguration { }
fuente
/swagger-resources
al abrirswagger-ui.html
. ¿Algun consejo? ¿Quizás más asignaciones de recursos?También puede considerar usar swagger-maven-plugin para generar swagger.json y copiarlo en el suyo estático swagger-ui.
Verifique una muestra simple de complemento de trabajo con anotaciones Spring MVC en este repositorio:
https://github.com/khipis/swagger-maven-example
o para JAX-RS
https://github.com/kongchen/swagger-maven-example
fuente