วิธีที่ 'ง่าย' ในการนำ Swagger ไปใช้ในแอปพลิเคชัน Spring MVC


85

ฉันมี ReSTFul API ที่เขียนด้วย Spring อย่างง่าย (ไม่มี Spring Boot ไม่มีของแฟนซี!) ฉันจำเป็นต้องใช้ Swagger ในสิ่งนี้ จนถึงตอนนี้ทุกหน้าบนอินเทอร์เน็ตทำให้ฉันคลั่งไคล้ด้วยการกำหนดค่าที่สับสนและรหัสที่บวมซึ่งฉันไม่พบแบบพกพาเลย

ใครมีโครงการตัวอย่าง (หรือชุดขั้นตอนโดยละเอียด) ที่สามารถช่วยฉันทำสิ่งนี้ให้สำเร็จได้บ้าง? โดยเฉพาะอย่างยิ่งฉันกำลังมองหาตัวอย่างที่ดีที่ใช้ swagger-springmvc ฉันรู้ว่ามันมี 'ตัวอย่าง' แต่อย่างดีที่สุดรหัสลับก็ทำให้ท้อใจ

ฉันต้องชี้แจงว่าฉันไม่ได้มองหา "ทำไม Swagger ถึงดีที่สุด" ฉันไม่ได้ใช้ (และสำหรับงานปัจจุบันของฉันจะไม่ใช้) Spring Boot หรืออื่น ๆ


4
โดยกลุ่มตัวอย่างที่ผมถือว่าคุณกำลังหมายถึงgithub.com/adrianbk/swagger-springmvc-demo ฉันขอแนะนำให้คุณเปิดตั๋วโดยตรงบน swagger-springmvc เนื่องจากเป็นสิ่งสำคัญสำหรับพวกเขาที่จะต้องรู้ว่าผู้ใช้ที่มีศักยภาพบางคนอาจรู้สึกว่าเอกสารไม่เพียงพอเพื่อให้สามารถปรับปรุงได้
รอน

อันนี้ช่วยstackoverflow.com/questions/26807791/…
spiderman

คำตอบ:


122

Springfox (Swagger spec 2.0, ปัจจุบัน)

Springfoxได้เข้ามาแทนที่ Swagger-SpringMVC และตอนนี้รองรับทั้งสเปค Swagger 1.2 และ 2.0 คลาสการใช้งานมีการเปลี่ยนแปลงทำให้สามารถปรับแต่งได้ลึกขึ้น แต่มีบางงาน เอกสารได้ดีขึ้น แต่ยังคงต้องการรายละเอียดบางอย่างเพิ่มสำหรับการกำหนดค่าขั้นสูง คำตอบเก่าสำหรับการใช้งาน 1.2 ยังคงอยู่ด้านล่าง

การพึ่งพา 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.

หมายเหตุ: หากคุณไม่ได้ใช้ Spring boot คุณควรเพิ่มการพึ่งพาแจ็คสัน - ฐานข้อมูล เนื่องจาก springfox ใช้แจ็คสันสำหรับการเชื่อมต่อฐานข้อมูล

การเพิ่มการรองรับ Swagger UI นั้นง่ายยิ่งกว่าเดิม หากคุณใช้ Maven ให้เพิ่มการอ้างอิงต่อไปนี้สำหรับ Webjar Swagger UI:

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

หากคุณกำลังใช้ Spring Boot แล้ว app เว็บของคุณควรเลือกโดยอัตโนมัติไฟล์ที่จำเป็นและแสดง UI ที่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อาจทำให้สับสนเล็กน้อย แต่จริงๆแล้วการตั้งค่านั้นง่ายอย่างเหลือเชื่อ การกำหนดค่าที่ง่ายที่สุดต้องสร้างSpringSwaggerConfigbean และเปิดใช้งานการกำหนดค่าตามคำอธิบายประกอบ (ซึ่งคุณอาจทำในโครงการ 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ของคุณสร้างขึ้นที่ ในการตั้งค่า UI ของ 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 UI สำหรับโครงการของคุณ


1
@MikhailBatcer: ฉันได้อัปเดตคำตอบด้วยการพึ่งพา Maven สำหรับ Springfox นี่คือการพึ่งพาเพียงอย่างเดียวที่คุณต้องรวมไว้ในโปรเจ็กต์ของคุณเว้นแต่คุณจะต้องการ Swagger UI หรือ Static Docs
woemler

2
ดูเหมือนว่า URL UI จะเป็น /myapp/swagger-ui.html และไม่ใช่ / springfox
chrismarx

7
เพื่อความสมบูรณ์: เมธอด 'regex' ในตัวอย่าง 'SwaggerConfig' ของ springfox มาจาก 'springfox.documentation.builders.PathSelectors.regex (String)' ถ้าฉันใช้เวลาพอสมควรในการคิดออก;)
cheneym

2
ฉันได้ใช้เสรีภาพในการเพิ่มPathSelectors.เพื่อช่วยผู้คนที่ดิ้นรนกับการนำเข้าแบบคงที่regex
Tim Büthe

1
ที่น่าสังเกต: หากทำตามคำแนะนำเหล่านี้อย่างถูกต้องและไม่ได้ใช้ SpringBoot คุณจะได้รับข้อผิดพลาดรันไทม์เนื่องจากไลบรารี springfox และ springfox-ui รุ่นต่างๆที่ดึงมาจาก Maven ให้เริ่มด้วยเวอร์ชันล่าสุดของทั้งสองหากเป็นไปได้ ( 2.5.0ตามที่ฉันเขียนไว้)
กีบ

13

Springfox Swagger UI ทำงานให้ฉันหลังจากเพิ่มการพึ่งพา 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>

สปริง 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เคล็ดลับใด ๆ อาจมีการแมปทรัพยากรเพิ่มเติมหรือไม่
Tim Büthe

ดูเหมือนว่าทรัพยากรผยองไม่ได้อยู่ในบริบทราก สามารถแก้ไขได้โดยการแมป DispatcherServlet กับบริบทราก ดูที่ปัญหาแก้ไขปัญหา 983และ คำถามหนึ่งจะกำหนดค่า swagger-ui สำหรับแอปพลิเคชันที่ไม่ใช่ Springboot ได้อย่างไร
Yuriy Tumakha

1

นอกจากนี้คุณยังสามารถพิจารณาใช้ swagger-maven-plugin เพื่อสร้าง swagger.json และคัดลอกไปยัง swagger-ui แบบคงที่ของคุณ

โปรดตรวจสอบตัวอย่างปลั๊กอินที่ใช้งานง่ายพร้อมคำอธิบายประกอบ Spring MVC ใน repo นี้:

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

หรือสำหรับ JAX-RS

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.