Swagger doc показывает «семантическую ошибку» в редакторе

#swagger #swagger-ui #swagger-2.0 #swagger-editor

#swagger #swagger-пользовательский интерфейс #swagger-2.0 #swagger-editor

Вопрос:

После создания файла swagger-yaml для создания и использования документа swagger editor.swagger.io , я получаю семантические ошибки, как показано ниже. Я пока не имею ни малейшего представления об этой ошибке тега ниже:

     Semantic error at paths./v1/entitlement/{entitlementId}.put.parameters.5.schema.$ref
    $ref values must be RFC3986-compliant percent-encoded URIs
    Jump to line 391
    Semantic error at paths./v1/entitlements/{skuId}.post.parameters.4.schema.$ref
    $ref values must be RFC3986-compliant percent-encoded URIs
    Jump to line 700
    Semantic error at paths./v1/entitlements/{skuId}.post.responses.200.schema.$ref
    $ref values must be RFC3986-compliant percent-encoded URIs
    Jump to line 710
    
 

Код:

SwaggerConfig.java — Для настройки свойств swagger2 для соответствующего контроллера приложения.

 package com.pearson.gsam.product.management.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import static springfox.documentation.spi.DocumentationType.SWAGGER_2;

@Configuration
@EnableSwagger2
@Profile({ "dev", "qa","local","stg","it" })
public class SwaggerConfig extends WebMvcConfigurationSupport {

    @Value("${application.name}")
    String appName;
    @Value("${application.description}")
    String appDescription;
    @Value("${application.version}")
    private String appVersion;

    @Bean
    public Docket api() {
        return new Docket(SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiEndPointsInfo());
    }


    private ApiInfo apiEndPointsInfo() {
        return new ApiInfoBuilder()
                .title(appName)
                .description(appDescription)
                .version(appVersion)
                .build();
    }

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");

    }
}

    
 

SwaggerDoc.java — К созданию swagger-API.Файл YAML и хранится в определенном каталоге

     package docs;
    
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.io.Writer;
    
    import com.pearson.gsam.product.management.entitlement.service.ProductManagementEntitlementService;
    import com.pearson.gsam.product.management.entitlement.service.ProductManagementEntitlementServiceImpl;
    import com.pearson.gsam.product.management.kafka.EventService;
    import com.pearson.gsam.product.management.kafka.KafkaCallBackHandler;
    import org.apache.commons.io.IOUtils;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration;
    import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
    import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
    import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.boot.test.mock.mockito.MockBean;
    import org.springframework.boot.test.mock.mockito.MockBeans;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Import;
    import org.springframework.kafka.test.context.EmbeddedKafka;
    import org.springframework.test.annotation.DirtiesContext;
    import org.springframework.test.context.ActiveProfiles;
    import org.springframework.test.web.servlet.MockMvc;
    
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
    import com.pearson.gsam.product.management.config.SwaggerConfig;
    import com.pearson.gsam.product.management.entitlement.ProductManagementEntitlementApplication ;
    
    @ActiveProfiles( "it" )
    @DirtiesContext
    @SpringBootTest(classes = {SwaggerConfig.class},
            properties = {"spring.profiles.active=it"})
    //@SpringBootTest(classes = ProductManagementEntitlementApplication.class)
    @EnableAutoConfiguration(exclude = {EmbeddedMongoAutoConfiguration.class, MongoAutoConfiguration.class, KafkaAutoConfiguration.class})
    @AutoConfigureMockMvc
    @ComponentScan(basePackages = {"com.pearson.gsam.product.management.controller", "springfox"})
    //@EmbeddedKafka
    @MockBeans(
            @MockBean( classes = { ProductManagementEntitlementService.class, EventService.class
                    })
    )
    @Import(SwaggerConfig.class)
    public class SwaggerDoc {
        @Value("${service-name}")
        String serviceName;
        
        @Autowired
        private MockMvc mockMvc;
    
        @Test
        public void generateSwagggerDoc() throws Exception {
            String contentAsString = mockMvc.perform(get("/v2/api-docs"))
                    .andDo(print())
                    .andExpect(status().isOk())
                    .andReturn()
                    .getResponse().getContentAsString();
    
            // parse JSON
            JsonNode jsonNodeTree = new ObjectMapper().readTree(contentAsString);
            // save it as YAML
            String jsonAsYaml = new YAMLMapper().writeValueAsString(jsonNodeTree);
    
            File file = new File("swagger/" serviceName "-API_Swagger.yml");
            file.getParentFile().mkdirs();
    
            try (Writer writer = new FileWriter(file)) {
                IOUtils.write(jsonAsYaml, writer);
            }
        }
    }
    
    
 

Я использую приведенные ниже банки для swagger:

     compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
        compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.10.0'
 

Комментарии:

1. в следующий раз, пожалуйста, правильно отформатируйте свой вопрос. это была действительно паршивая попытка

2. конечно, @JamesZ, во время публикации возникла какая-то проблема с сетью, и произошло дублирование

3. Я бы предложил поделиться спецификацией OpenAPI / Swagger, которую вы используете в редакторе Swagger (или генерируется приложением). Трудно определить это, взглянув на ошибку из средства проверки Swagger и сославшись на неполный код. Или вы можете поделиться кодом для контроллеров и удалить фактическую работу контроллера, чтобы сохранить его в чистоте.