Spring MVC 애플리케이션에서 Swagger를 구현하는 '간단한'방법


85

간단한 Spring으로 작성된 ReSTFul API가 있습니다 (Spring Boot 없음, 멋진 물건 없음!). 여기에 Swagger를 구현해야합니다. 지금까지 인터넷의 모든 페이지는 이식성이 전혀없는 혼란스러운 구성과 부풀어 오른 코드로 나를 미치게 만들었습니다.

이 작업을 수행하는 데 도움이되는 샘플 프로젝트 (또는 일련의 세부 단계)가 있습니까? 특히 swagger-springmvc를 사용하는 좋은 샘플을 찾고 있습니다. 나는 그것이 '샘플'을 가지고 있다는 것을 알고 있지만 기껏해야 난해한 코드는 낙담합니다.

"Swagger가 단순히 최고인 이유"를 찾고 있지 않음을 분명히해야합니다. 나는 Spring Boot 등을 사용하지 않습니다 (현재 작업에는 사용하지 않을 것입니다).


4
샘플을 통해 github.com/adrianbk/swagger-springmvc-demo를 참조한다고 가정합니다 . 잠재적 인 사용자 중 일부가 문서가 부적절하다고 생각하여 개선 할 수 있다는 것을 아는 것이 중요하므로 swagger-springmvc에서 직접 티켓을 여는 것이 좋습니다.
Ron

답변:


122

Springfox (Swagger 사양 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 부트를 사용하지 않는 경우 jackson-databind 종속성을 추가해야합니다. springfox는 데이터 바인딩에 jackson을 사용하기 때문에.

이제 Swagger UI 지원을 추가하는 것이 훨씬 더 쉽습니다. Maven을 사용하는 경우 Swagger UI webjar에 다음 종속성을 추가하십시오.

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

Spring Boot를 사용하는 경우 웹 앱이 자동으로 필요한 파일을 선택하고 http://myapp/swagger-ui.html(이전 :)에 UI를 표시해야합니다 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 사양 1.2 이전)

Swagger-SpringMVC에 대한 문서는 약간 혼란 스러울 수 있지만 실제로 설정하는 것은 매우 쉽습니다. 가장 간단한 구성은 SpringSwaggerConfig빈을 생성하고 주석 기반 구성을 활성화 해야 합니다 (아마도 Spring MVC 프로젝트에서 이미 수행 한 작업).

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

그러나 SwaggerSpringMvcPlugin이전 XML 정의 빈 대신을 사용하여 사용자 지정 Swagger 구성을 정의하는 추가 단계를 수행하는 것이 좋습니다.

@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 UI를 설정하려면 GitHub 프로젝트 에서 정적 파일을 복제하여 프로젝트 에 넣어야합니다. 프로젝트가 정적 HTML 파일을 제공하도록 구성되었는지 확인합니다.

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

그런 다음 index.htmlSwagger UI dist디렉터리 의 최상위 수준에서 파일을 편집합니다 . 파일 상단 api-docs에는 다른 프로젝트 의 URL을 참조하는 JavaScript가 있습니다. 프로젝트의 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 : Springfox에 대한 Maven 종속성으로 답변을 업데이트했습니다. Swagger UI 또는 정적 문서도 원하지 않는 한 프로젝트에 포함해야하는 유일한 종속성입니다.
woemler

2
UI를 URL이 같은 모습은 이제 /myapp/swagger-ui.html하지 / springfox입니다
chrismarx

7
완전성을 위해 : springfox 'SwaggerConfig'예제의 'regex'메소드는 'springfox.documentation.builders.PathSelectors.regex (String)'에서 가져온 것입니다. 알아내는 데 꽤
오랜 시간이 걸렸다면

2
내가 추가 할 자유를 촬영했습니다 PathSelectors.의 고정 수입으로 어려움을 겪고 도움말 사람들regex
팀 쎄

1
주목할 가치가 있습니다.이 지침을 정확히 따르고 SpringBoot를 사용하지 않으면 Maven에서 검색 한 springfox 및 springfox-ui 라이브러리의 다른 버전으로 인해 런타임 오류가 발생합니다. 대신 가능하면 두 가지 모두의 최신 버전으로 시작하십시오 ( 2.5.0내가이 글을 쓰는대로)
Kip

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>

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 주석 https://github.com/springfox/springfox-demos/blob/master/spring-java-swagger/src/main/java/springfoxdemo/java/swagger/SpringConfig.java

Swagger2를 활성화해야합니다.

 @EnableSwagger2
 public class SwaggerConfiguration {
 }

이것은 나에게 많은 도움이되었지만 .NET을 /swagger-resources열 때 여전히 404가 표시 됩니다 swagger-ui.html. 팁이 있습니까? 더 많은 리소스 매핑이 가능할까요?
Tim Büthe

swagger-resources가 루트 컨텍스트가 아닌 것 같습니다. DispatcherServlet을 루트 컨텍스트에 매핑하여 수정할 수 있습니다. 문제 수정 문제 983Q를
Yuriy Tumakha

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.