#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 и сославшись на неполный код. Или вы можете поделиться кодом для контроллеров и удалить фактическую работу контроллера, чтобы сохранить его в чистоте.