Spring MVC uygulamasında Swagger'ı uygulamanın 'basit' bir yolu


85

Basit Spring ile yazılmış bir ReSTFul API'm var (Spring Boot yok, süslü şeyler yok!). Swagger'ı buna uygulamalıyım. Şimdiye kadar, internetteki HER sayfa beni sadece kafa karıştırıcı konfigürasyonlar ve hiç taşınabilir bulamadığım şişirilmiş kodlarla çılgına çevirdi.

Bunu başarmama yardımcı olabilecek örnek bir projesi (veya bir dizi ayrıntılı adım) olan var mı? Özellikle, swagger-springmvc kullanan iyi bir örnek arıyorum. 'Örnekleri' olduğunu biliyorum, ama en iyi ihtimalle ezoterik kod cesaret kırıcı.

"Swagger'ın neden en iyisi olduğunu" aramadığımı açıklığa kavuşturmalıyım. Spring Boot veya benzeri kullanmıyorum (ve şu anki görevim için kullanmayacağım).


4
Örneklere göre, github.com/adrianbk/swagger-springmvc-demo'ya başvurduğunuzu varsayıyorum . Aslında, sizi doğrudan swagger-springmvc'de bir bilet açmanızı tavsiye ederim, çünkü potansiyel kullanıcılarının bazılarının belgelerin yetersiz olduğunu düşündüğünü ve böylece geliştirebileceklerini bilmeleri önemlidir.
Ron

Yanıtlar:


122

Springfox (Swagger spec 2.0, güncel)

Springfox , Swagger-SpringMVC'nin yerini aldı ve artık hem Swagger teknik özellikleri 1.2 hem de 2.0'ı destekliyor. Uygulama sınıfları, biraz daha derin özelleştirmeye izin verecek şekilde, ancak biraz çalışmayla değişti. Dokümantasyon geliştirilmiş, ancak yine de gelişmiş yapılandırma için eklenen bazı ayrıntılar gerekiyor. 1.2 uygulaması için eski cevap hala aşağıda bulunabilir.

Maven bağımlılığı

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.5.0</version>
</dependency> 

Çıplak minimum uygulama aşağı yukarı aynı görünüyor, ancak artık Docketsınıf yerine SwaggerSpringMvcPluginsınıfı kullanıyor:

@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 belgeleriniz şimdi adresinde mevcut olacak http://myapp/v2/api-docs.

Not: Spring boot kullanmıyorsanız, jackson-databind bağımlılığı eklemelisiniz. Springfox veri bağlama için Jackson kullandığından beri.

Swagger UI desteği eklemek artık çok daha kolay. Maven kullanıyorsanız, Swagger UI webjar için aşağıdaki bağımlılığı ekleyin:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.5.0</version>
</dependency>

Spring Boot kullanıyorsanız, web uygulamanız otomatik olarak gerekli dosyaları almalı ve http://myapp/swagger-ui.html(eski adıyla :) konumunda kullanıcı arayüzünü göstermelidir http://myapp/springfox. Spring Boot kullanmıyorsanız, yuriy-tumakha'nın aşağıdaki cevapta bahsettiği gibi, dosyalar için bir kaynak işleyici kaydetmeniz gerekecektir. Java yapılandırması şuna benzer:

@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/");
    }

}

Yeni statik belge oluşturma özelliği de oldukça hoş görünüyor, ancak bunu kendim denemedim.

Swagger-SpringMVC (Swagger spec 1.2, daha eski)

Swagger-SpringMVC'nin dokümantasyonu biraz kafa karıştırıcı olabilir, ancak aslında kurulumu inanılmaz derecede kolaydır. En basit yapılandırma, bir SpringSwaggerConfigfasulye oluşturmayı ve açıklama tabanlı yapılandırmayı etkinleştirmeyi gerektirir (muhtemelen Spring MVC projenizde zaten yapıyorsunuz):

<mvc:annotation-driven/>
<bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" />

Bununla birlikte, SwaggerSpringMvcPluginönceki XML tanımlı çekirdek yerine özel bir Swagger yapılandırmasını tanımlamanın ekstra adımını atmaya değer olduğunu düşünüyorum :

@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();
    }

}

Uygulamanızı çalıştırdığınızda, şimdi API spesifikasyonunuzun oluşturulduğunu görmelisiniz http://myapp/api-docs. Süslü Swagger UI kurulumunu elde etmek için, statik dosyaları GitHub projesinden klonlamanız ve bunları projenize yerleştirmeniz gerekir. Projenizin statik HTML dosyalarını sunacak şekilde yapılandırıldığından emin olun:

<mvc:resources mapping="*.html" location="/" />

Ardından index.htmldosyayı Swagger UI distdizininin üst seviyesinde düzenleyin . Dosyanın üst kısmına doğru, api-docsbaşka bir projenin URL'sine atıfta bulunan bazı JavaScript'ler göreceksiniz . Bunu, projenizin Swagger belgelerine işaret edecek şekilde düzenleyin:

  if (url && url.length > 1) {
    url = url[1];
  } else {
    url = "http://myapp/api-docs";
  }

Şimdi adresine http://myapp/path/to/swagger/index.htmlgittiğinizde, projeniz için Swagger UI örneğini görmelisiniz.


1
@MikhailBatcer: Yanıtı, Springfox için Maven bağımlılığıyla güncelledim. Swagger UI veya Static Docs istemediğiniz sürece, projenize dahil etmeniz gereken tek bağımlılık budur.
woemler

2
UI url'si artık /myapp/swagger-ui.html ve / springfox değil gibi görünüyor
chrismarx

7
Tamlık için: Springfox 'SwaggerConfig' örneğindeki 'regex' yöntemi 'springfox.documentation.builders.PathSelectors.regex (String)' kaynağındandır. Bunu
anlamam biraz zaman aldıysa

2
Ben eklemek için özgürlük geçtiniz PathSelectors.statik ithalat ile mücadele yardım insanlararegex
Tim Büthe

1
Dikkate değer: Bu talimatları tam olarak uygularsanız ve SpringBoot'u kullanmıyorsanız, Maven'den alınan springfox ve springfox-ui kitaplıklarının farklı sürümleri nedeniyle bir çalışma zamanı hatası alırsınız. Bunun yerine, (her ikisi de mümkünse en son sürümü ile başlamak 2.5.0bu mektubu yazarken)
Kip

13

Springfox Swagger UI, WebJar bağımlılığı ve kaynak eşlemeleri ekledikten sonra benim için çalışıyor. 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/"/>

veya Bahar Notu https://github.com/springfox/springfox-demos/blob/master/spring-java-swagger/src/main/java/springfoxdemo/java/swagger/SpringConfig.java

Swagger2 etkinleştirilmelidir

 @EnableSwagger2
 public class SwaggerConfiguration {
 }

Bu bana çok yardımcı oldu, ancak /swagger-resourcesaçılışta hala 404 alıyorum swagger-ui.html. Herhangi bir ipucu? Belki daha fazla kaynak eşlemesi?
Tim Büthe

Görünüşe göre swagger kaynakları kök bağlamında değil. DispatcherServlet'i kök içeriğe eşleyerek düzeltilebilir. Sorun düzeltme sorunu 983 ve Q'ya
Yuriy Tumakha

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.