"Простий" спосіб реалізації Swagger у програмі Spring MVC


85

У мене є API ReSTFul, написаний простою Spring (без Spring Boot, без вишуканих речей!). Мені потрібно застосувати в цьому Суаггера. Поки що КОЖНА сторінка в Інтернеті зводила мене з розуму лише заплутаними конфігураціями та роздутим кодом, який я взагалі не знайшов портативним.

Хто-небудь має зразок проекту (або набір детальних кроків), який може допомогти мені досягти цього? Зокрема, я шукаю хороший зразок, який використовує swagger-springmvc. Я знаю, що у ньому є "зразки", але в кращому випадку езотеричний код знеохочує.

Потрібно пояснити, що я не шукаю "чому Swagger просто найкращий". Я не використовую (і для мого поточного завдання не буду використовувати) Spring Boot або подібне.


4
За прикладами, я припускаю, що ви маєте на увазі github.com/adrianbk/swagger-springmvc-demo . Я насправді закликаю вас відкрити квиток безпосередньо на swagger-springmvc, оскільки їм важливо знати, що деякі з їхніх потенційних користувачів можуть відчувати, що документи недостатні, щоб вони могли їх покращити.
Рон

Відповіді:


122

Springfox (специфікація Swagger 2.0, поточна)

Springfox замінив Swagger-SpringMVC і тепер підтримує як специфікації Swagger 1.2, так і 2.0. Класи реалізації змінилися, що дозволило провести глибшу настройку, але з деякою роботою. Документація покращилася, але все ще потребує в деяких деталях додана для розширеної конфігурації. Стару відповідь щодо реалізації 1.2 все ще можна знайти нижче.

Залежність Мейвена

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

}

Ваша документація щодо API Swagger 2.0 тепер буде доступна за адресою http://myapp/v2/api-docs.

Примітка: Якщо ви не використовуєте Spring boot, тоді вам слід додати залежність jackson-databind. Оскільки springfox використовує Джексона для прив'язки даних.

Додавати підтримку інтерфейсу Swagger зараз ще простіше. Якщо ви використовуєте Maven, додайте таку залежність для веб-користувача Swagger UI:

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

Якщо ви використовуєте Spring Boot, то ваш веб-додаток повинен автоматично забрати необхідні файли та показати інтерфейс користувача на http://myapp/swagger-ui.html(раніше:) http://myapp/springfox. Якщо ви не використовуєте Spring Boot, то, як зазначає yuriy-tumakha у відповіді нижче, вам потрібно буде зареєструвати обробник ресурсів для файлів. Конфігурація Java виглядає так:

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

}

Нова функція генерації статичної документації також виглядає досить приємно, хоча я її ще не випробовував.

Swagger-SpringMVC (Swagger spec 1.2, старіша версія)

Документація для Swagger-SpringMVC може трохи заплутати, але насправді неймовірно просто налаштувати. Найпростіша конфігурація вимагає створення SpringSwaggerConfigкомпонента і включення конфігурації на основі анотацій (що ви, мабуть, уже робите у своєму проекті Spring MVC):

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

Однак я думаю, що варто зробити додатковий крок щодо визначення власної конфігурації Swagger, використовуючи SwaggerSpringMvcPluginзамість попереднього компонента, визначеного 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();
    }

}

Під час запуску програми ви повинні побачити специфікацію API, створену за адресою http://myapp/api-docs. Щоб налаштувати вигадливий інтерфейс Swagger, вам потрібно клонувати статичні файли з проекту GitHub і помістити їх у свій проект. Переконайтеся, що ваш проект налаштований на обслуговування статичних файлів HTML:

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

Потім відредагуйте index.htmlфайл на верхньому рівні distкаталогу Swagger UI . Угорі файлу ви побачите JavaScript, який посилається на api-docsURL-адресу іншого проекту. Відредагуйте це, щоб вказати на документацію Swagger вашого проекту:

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

Тепер, коли ви переходите до http://myapp/path/to/swagger/index.html, ви повинні побачити екземпляр інтерфейсу Swagger для вашого проекту.


1
@MikhailBatcer: Я оновив відповідь залежністю Maven для Springfox. Це єдина залежність, яку потрібно включити у свій проект, якщо ви також не хочете користувацький інтерфейс Swagger або статичні документи.
woemler 02

2
схоже, що URL-адреса інтерфейсу зараз /myapp/swagger-ui.html, а не /
springfox

7
Для повноти: Метод 'regex' у прикладі springfox 'SwaggerConfig' подано з 'springfox.documentation.builders.PathSelectors.regex (String)'. Якщо мені знадобилося досить багато часу, щоб це зрозуміти;)
cheneym

2
Я дозволив собі додати, PathSelectors.щоб допомогти людям, які борються зі статичним імпортомregex
Тім Бюте

1
Варто зазначити: якщо точно слідувати цим інструкціям і не використовувати SpringBoot, ви отримаєте помилку виконання через різні версії бібліотек springfox та springfox-ui, отриманих з Maven. Натомість починайте з останньої версії обох, якщо це можливо ( 2.5.0поки я пишу це)
Kip

13

Інтерфейс інтерфейсу Springfox Swagger працює для мене після додавання залежностей WebJar та відображення ресурсів. 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 {
 }

Це мені дуже допомогло, проте я все ще отримую 404 /swagger-resourcesпри відкритті swagger-ui.html. Будь-які поради? Можливо, більше відображень ресурсів?
Тім Бюте

Схоже на те, що ресурси хитрості не в кореневому контексті. Це можна виправити, зіставивши DispatcherServlet у кореневий контекст. Подивіться на проблему з виправленням проблем 983 та Q. Як налаштувати swagger-ui для додатків, що не працюють із Springboot?
Юрій Тумаха

1

Ви також можете розглянути можливість використання swagger-maven-plugin для створення swagger.json і скопіювати його у свій статичний swagger-ui.

Будь ласка, перевірте простий зразок робочого плагіна з анотаціями Spring MVC у цьому репо:

https://github.com/khipis/swagger-maven-example

або для JAX-RS

https://github.com/kongchen/swagger-maven-example

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.