Невозможно получить интерфейс Swagger с загрузкой Spring

Я пытаюсь заставить пользовательский интерфейс Swagger работать с Spring Boot 1.2.1. Я выполнил инструкции https://github.com/martypitt/swagger-springmvc, и я добавил @EnableSwagger в мой конфигуратор Spring.

В настоящее время я возвращаюсь к JSON, когда я перехожу к http://localhost:8080/api-docs, но не имеет хорошего HTML.

Я использую Maven и добавил зависимость от swagger-ui:

<dependency>
    <groupId>org.ajar</groupId>
    <artifactId>swagger-spring-mvc-ui</artifactId>
    <version>0.4</version>
</dependency>

Это мой полный список зависимостей:

<dependencies>
        <dependency>
            <groupId>com.mangofactory</groupId>
            <artifactId>swagger-springmvc</artifactId>
            <version>0.9.4</version>
        </dependency>
        <dependency>
            <groupId>org.ajar</groupId>
            <artifactId>swagger-spring-mvc-ui</artifactId>
            <version>0.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Я также пробовал http://localhost:8080/docs/index.html в качестве URL-адреса, но это просто дает "страницу ошибок Whitelabel"

Update:

Я создал тестовый проект на Github, чтобы показать проблему: https://github.com/wimdeblauwe/springboot-swagger-test

Ответы

Ответ 1

Ваша проблема заключается в вашем файле SwaggerConfiguration. Вам нужно вынуть @EnableWebMvc, потому что это приведет к тому, что результирующее изображение по умолчанию Spring Boot View будет перезаписано по умолчанию "SpringWebMvc", которое по-разному ставит контент.

По умолчанию Spring Boot будет обслуживать статический контент из любого из следующих каталогов:

  • /META-INF/ресурсы/
  • /ресурсы/
  • /статический/
  • /государственный/

включая webjars.

У меня была та же проблема, и я нашел это в документации: http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-auto-configuration

Если вы хотите полностью контролировать Spring MVC, вы можете добавить свой собственный @Configuration, аннотированный с помощью @EnableWebMvc. Если вы хотите сохранить функции Spring Boot MVC, и вы просто хотите добавить дополнительную конфигурацию MVC (перехватчики, форматировщики, контроллеры представлений и т.д.), Вы можете добавить свой собственный @Bean типа WebMvcConfigurerAdapter, но без @EnableWebMvc.

Надеюсь, это поможет.

Ответ 2

У меня есть swagger-ui v0.4 (с spring v4.14 и swagger-springmvc v0.9.4) работает нормально, хотя сначала у меня были некоторые подобные проблемы. Кажется, этот класс делает трюк.

@Configuration
@EnableSwagger
public class SwaggerConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private SpringSwaggerConfig springSwaggerConfig;

    @Bean
    public SwaggerSpringMvcPlugin customImplementation() {
        return new SwaggerSpringMvcPlugin(springSwaggerConfig).apiInfo(
                apiInfo());
    }

    private ApiInfo apiInfo() {
        return new ApiInfo(/* strings */);
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

Я считаю, что релевантная вещь - переопределенная configureDefaultServletHandling. И на моем главном WebApplicationInitializer у меня есть:

@Import(SwaggerConfig.class)

Наконец, я исправил проблему с полем местоположения пользовательского интерфейса, в котором показано " http://localhost:8080 ${pageContext.request.contextPath}/api-docs" включив это в мои зависимости:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <!--<version>8.0.15</version>-->
    <scope>provided</scope>
</dependency>

Это обеспечивает что-то, что связано с обработкой JSP. Он включен в зависимости от spring-boot, но обычно он не provided.

Надеюсь, что это поможет.

Ответ 3

У меня такая же проблема, но эта ссылка работает для меня: http://localhost:8080/sdoc.jsp

Он предварительно заполняет ячейку url ресурса swagger с: http://localhost:8080 ${pageContext.request.contextPath}/api-docs

и когда я вручную отредактировал его, удалив ${pageContext.request.contextPath} и ​​нажав Explore, он показывает мне мой api doc, и я могу даже попробовать свои конечные точки успешно. Так что определенно проблема, но, вероятно, не собирающая ${pageContext.request/contextPath}.

Глядя на источник, у javascript есть: url: window.location.origin + "$ {pageContext.request.contextPath}/api-docs"

на статическом swagger ui html У меня этот кусок закодирован как:

discoveryUrl: "./ресурсов list.json"

Надеюсь, это немного полезно

Ответ 4

Я сделал отдельную конфигурацию для Swagger, и моя проблема заключалась в том, что без @EnableAutoConfiguration он работал неправильно.

@Configuration
@EnableSwagger2
@EnableAutoConfiguration
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }
}

Ответ 5

Я бы предложил вам использовать тег @EnableSwagger2 и выполнить следующие шаги и код здесь: https://github.com/sanketsw/SpringBoot_REST_API

Также я использую следующую зависимость, которая отлично работает:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.2.2</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.2.2</version>
    <scope>compile</scope>
</dependency>