Một cách 'đơn giản' để triển khai Swagger trong ứng dụng Spring MVC


85

Tôi có một API ReSTFul được viết bằng Spring đơn giản (không có Spring Boot, không có nội dung cầu kỳ!). Tôi cần triển khai Swagger vào điều này. Cho đến nay, MỌI trang trên internet chỉ khiến tôi phát điên với các cấu hình khó hiểu và mã cồng kềnh mà tôi không tìm thấy tính di động nào cả.

Có ai có dự án mẫu (hoặc một tập hợp các bước chi tiết) có thể giúp tôi thực hiện điều này không? Đặc biệt, tôi đang tìm kiếm một mẫu tốt có sử dụng swagger-springmvc. Tôi biết nó có 'mẫu', nhưng tốt nhất, mã bí truyền không được khuyến khích.

Tôi phải làm rõ rằng tôi không tìm kiếm "tại sao Swagger chỉ đơn giản là tốt nhất". Tôi không sử dụng (và cho tác vụ hiện tại của tôi sẽ không sử dụng) Spring Boot hoặc tương tự.


4
Theo các mẫu, tôi cho rằng bạn đang đề cập đến github.com/adrianbk/swagger-springmvc-demo . Tôi thực sự khuyến khích bạn mở một vé trực tiếp trên swagger-springmvc vì điều quan trọng là họ phải biết rằng một số người dùng tiềm năng của họ có thể cảm thấy tài liệu không đủ để họ có thể cải thiện nó.
Ron

Câu trả lời:


122

Springfox (Swagger spec 2.0, hiện tại)

Springfox đã thay thế Swagger-SpringMVC và hiện hỗ trợ cả thông số kỹ thuật Swagger 1.2 và 2.0. Các lớp triển khai đã thay đổi, cho phép một số tùy chỉnh sâu hơn, nhưng với một số công việc. Các tài liệu đã được cải thiện, nhưng vẫn cần một số chi tiết bổ sung cho cấu hình tiên tiến. Câu trả lời cũ cho việc triển khai 1.2 vẫn có thể được tìm thấy bên dưới.

Maven phụ thuộc

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

Việc triển khai tối thiểu gần như giống nhau, nhưng bây giờ sử dụng Docketlớp thay vì SwaggerSpringMvcPluginlớp:

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

}

Tài liệu API Swagger 2.0 của bạn hiện sẽ có sẵn tại http://myapp/v2/api-docs.

Lưu ý: Nếu bạn không sử dụng Spring boot thì bạn nên thêm phụ thuộc jackson-databind. Vì springfox sử dụng jackson cho databinding.

Giờ đây, việc thêm hỗ trợ giao diện người dùng Swagger thậm chí còn dễ dàng hơn. Nếu bạn đang sử dụng Maven, hãy thêm phần phụ thuộc sau cho webjar giao diện người dùng Swagger:

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

Nếu bạn đang sử dụng Spring Boot, thì ứng dụng web của bạn sẽ tự động chọn các tệp cần thiết và hiển thị giao diện người dùng tại http://myapp/swagger-ui.html(trước đây http://myapp/springfox:). Nếu bạn không sử dụng Spring Boot, thì như yuriy-tumakha đề cập trong câu trả lời bên dưới, bạn sẽ cần đăng ký một trình xử lý tài nguyên cho các tệp. Cấu hình Java trông như thế này:

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

}

Tính năng tạo tài liệu tĩnh mới trông cũng khá đẹp, mặc dù tôi chưa tự mình thử.

Swagger-SpringMVC (Swagger spec 1.2, cũ hơn)

Tài liệu cho Swagger-SpringMVC có thể hơi khó hiểu, nhưng nó thực sự rất dễ thiết lập. Cấu hình đơn giản nhất yêu cầu tạoSpringSwaggerConfig bean và bật cấu hình dựa trên chú thích (mà bạn có thể đã thực hiện trong dự án Spring MVC của mình):

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

Tuy nhiên, tôi nghĩ rằng rất đáng để thực hiện thêm bước xác định cấu hình Swagger tùy chỉnh bằng cách sử dụng SwaggerSpringMvcPluginbean được định nghĩa bằng XML trước đó:

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

}

Khi bạn chạy ứng dụng của mình, bây giờ bạn sẽ thấy thông số API của mình được tạo tại http://myapp/api-docs. Để thiết lập giao diện người dùng Swagger ưa thích, bạn cần sao chép các tệp tĩnh từ dự án GitHub và đưa chúng vào dự án của mình. Đảm bảo rằng dự án của bạn được định cấu hình để phân phát các tệp HTML tĩnh:

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

Sau đó, chỉnh sửa index.htmltệp ở cấp cao nhất của thư mục Swagger UI dist. Ở phía trên cùng của tệp, bạn sẽ thấy một số JavaScript đề cập đến api-docsURL của một dự án khác. Chỉnh sửa điều này để trỏ đến tài liệu Swagger của dự án của bạn:

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

Bây giờ khi bạn điều hướng đến http://myapp/path/to/swagger/index.html, bạn sẽ thấy phiên bản giao diện người dùng Swagger cho dự án của mình.


1
@MikhailBatcer: Tôi đã cập nhật câu trả lời với sự phụ thuộc của Maven cho Springfox. Đây là phần phụ thuộc duy nhất bạn cần đưa vào dự án của mình, trừ khi bạn cũng muốn giao diện người dùng Swagger hoặc Tài liệu tĩnh.
woemler

2
có vẻ như url giao diện người dùng bây giờ là /myapp/swagger-ui.html chứ không phải / springfox
chrismarx

7
Để có tính hoàn chỉnh: Phương thức 'regex' trong ví dụ 'SwaggerConfig' của Springfox là từ 'springfox.documentation.builders.PathSelectors.regex (String)'. Nếu đưa tôi khá một thời gian để con số đó ra;)
cheneym

2
Tôi đã lấy sự tự do để thêm PathSelectors.để giúp đỡ những người đang gặp khó khăn với nhập khẩu tĩnh củaregex
Tim Buthe

1
Cần lưu ý: nếu làm theo chính xác các hướng dẫn này và không sử dụng SpringBoot, bạn sẽ gặp phải lỗi thời gian chạy do các phiên bản khác nhau của thư viện springfox và springfox-ui được lấy từ Maven. Thay vào đó, bắt đầu với phiên bản mới nhất của cả hai nếu có thể ( 2.5.0như tôi viết những dòng này)
Kip

13

Springfox Swagger UI phù hợp với tôi sau khi thêm ánh xạ tài nguyên và phụ thuộc 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/"/>

hoặc Chú thích mùa xuân https://github.com/springfox/springfox-demos/blob/master/spring-java-swagger/src/main/java/springfoxdemo/java/swagger/SpringConfig.java

Swagger2 nên được bật

 @EnableSwagger2
 public class SwaggerConfiguration {
 }

Điều này đã giúp tôi rất nhiều, tuy nhiên tôi vẫn nhận được 404 /swagger-resourceskhi mở swagger-ui.html. Bất kỳ lời khuyên? Có thể có nhiều ánh xạ tài nguyên hơn?
Tim Büthe

Có vẻ như swagger-resources không có trong ngữ cảnh gốc. Nó có thể được khắc phục bằng cách ánh xạ DispatcherServlet với ngữ cảnh gốc. Xem bản sửa lỗi sự cố 983Q. Làm cách nào để định cấu hình swagger-ui cho các ứng dụng không phải Springboot?
Yuriy Tumakha

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.