Spring Fox (Swagger) 2.9.2 Автоматически сгенерированный swagger-ui не показывает интерактивный API - PullRequest
0 голосов
/ 09 ноября 2019

Используя Spring Fox 2.9.2 с Spring Boot 2.1.5 RELEASE, я не могу использовать интерактивный интерфейс, сгенерированный Swagger.

Это с конечными точками REST, не расширенными:

enter image description here


Это с расширенной конечной точкой REST (как вы можете видеть, внутри нет текстового поля для ввода идентификатора):

enter image description here


Maven pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.5.RELEASE</version>
    <relativePath/>
</parent>

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

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


Swagger2Config.java:

package com.myservice.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class Swagger2Config {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2).select()
                                   .apis(RequestHandlerSelectors
                                   .basePackage("com.myservice"))
                                   .paths(PathSelectors.any())
                                   .build()
                                   .apiInfo(apiEndPointsInfo());
    }

    private ApiInfo apiEndPointsInfo() {
        return new ApiInfoBuilder().title("MyService API")
                                   .description("Buildings you measure.")
                                   .contact(new Contact(null, null, null))
                                   .license("Apache 2.0")
                                   .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
                                   .version("1.0.0")
                                   .build();
    }
}

Также заметилв том, что мне не нужно было использовать какие-либо специфические аннотации Swagger (например, @ApiOperation & @ApiResponse) внутри RestController (я пытался поместить их выше getByUsingId(Integer id) метода, и, хотя моя документация была видимой, у нее все еще не было текстового поля id):

RestController:

@RequestMapping(value = {"/{id}" }, method = RequestMethod.GET, produces = "APPLICATION/JSON")
public ResponseEntity<Object> getByUsingId(@PathVariable(value = "id", required = true) Integer id) 
throws IOException {
       MyResponse response = myDao.getById(id);
       if (response == null) {
           return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
       }
       return new ResponseEntity<Object>(response, headers, HttpStatus.OK);
}

Сравнивая это со старым проектом Spring Boot 1.5.6 RELEASE, Spring Fox 2.6.1 имеет гораздо лучший пользовательский интерфейс и является интерактивным (обратите внимание на лучшие цвета и видимое текстовое поле при расширении):

enter image description here

Thisэто именно то, что мне нужно и нужно.


Maven pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
</parent>

<dependencies>
    <dependency>
       <groupId>io.springfox</groupId>
       <artifactId>springfox-swagger2</artifactId>
       <version>2.6.1</version>
       <scope>compile</scope>
    </dependency>

    <dependency>
       <groupId>io.springfox</groupId>
       <artifactId>springfox-swagger-ui</artifactId>
       <version>2.6.1</version>
       <scope>compile</scope>
    </dependency>
<dependencies>

Swagger2Config.java:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.common.base.Predicates;

import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableSwagger2
@Configuration
public class SwaggerConfig {

    @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any())
                .paths(Predicates.not(PathSelectors.regex("/error"))).build().apiInfo(metaInfo());
    }

    private ApiInfo metaInfo() {
        ApiInfo apiInfo = new ApiInfo("Hierarchy Project", "Hierarchy Demo as a Spring Boot based Microservice", "1.0", null,
                new Contact("", "", ""), "", "");

        return apiInfo;
    }
}

RestController:

@ApiOperation(httpMethod = "GET", value = "Get All Records Within a Level of Hierarchy Based On Parent Node.", 
                                  notes = "List records within a level of the hierarchy, for a given parent node.",
                                  produces = "application/json")
@ApiResponses(value = 
             { 
                @ApiResponse(code = 200, message = "Successful GET Command", response = String.class),
                @ApiResponse(code = 404, message = "Not Found") 
             }
)
@RequestMapping(value = { "/api/nodes" }, method = RequestMethod.GET, produces = "APPLICATION/JSON")
public ResponseEntity<Object> getHierarchyByUsingNode(Node node) throws Exception {
    if (null == node) {
        return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
    }
    List<Node> nodes = nodeService.getHierarchyPerParentNode(node);

    if (nodes.isEmpty()) {
        return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
    } 
    else {
        return new ResponseEntity<Object>(nodes, headers, HttpStatus.OK);
    }
}

Когда я пытался использовать зависимости Spring Fox 2.6.1 внутри моего проекта Spring Boot 2.1.5.RELEASE, страница swagger-ui.html даже не отображалась!

Как можно заметить, в то время как Spring Fox 2.9.2 не нуждается в аннотациях, сгенерированная страница swagger-ui.html не только выглядит иначе (с точки зрения цветов и т. Д.), Но даже не имеет текстовых полей, подобных моемуВторой пример, Проект Иерархии, делает.


Вопрос (ы):

  1. Это возможная ошибка (неинтерактивное текстовое поле) в Spring Fox2.9.2?

  2. Почему чванство выглядело тупым (цвета разные, не такие резкие и т. Д.)?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Понял ... Более старые версии Swagger использовали кнопку "Try it Out" для выполнения вызовов REST ...

Теперь это двухэтапный процесс, вам нужно нажать насначала нажмите кнопку «Попробуйте», введите идентификатор внутри текстового поля, а затем нажмите очень длинную синюю кнопку «Выполнить», расположенную горизонтально.

Это было ужасное изменение (с точки зрения эстетики и дизайна пользовательского интерфейса), и оно не так интуитивно понятно, как предыдущий дизайн.

0 голосов
/ 09 ноября 2019

Попробуйте добавить это в ваш pom.xml

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

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

, а также

@Bean
    public Docket apiDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("myPackage"))
                .paths(PathSelectors.any())
                .build();
    }

, где myPackage - это пакет, содержащий класс начальной загрузки Spring.

Надеюсь, это решит вашу проблему. :)

...