#java #spring #spring-mvc #swagger
#java #spring #spring-mvc #swagger
Вопрос:
Я могу получить ответ json от localhost:8080/v2/api-docs
но когда я пытаюсь загрузить swagger-ui на localhost:8080/swagger-ui.html
, он показывает swagger-ui без указанного там api.
Комментарии:
1. Загрузите swagger-ui с открытой консолью JS — сообщает ли он о каких-либо ошибках?
2. Отредактируйте свой вопрос и опубликуйте свой класс SwaggerConfig. Кроме того, если вы используете Spring Security, проверьте свою конфигурацию Cors.
Ответ №1:
Возможно, вы сможете просмотреть следующие моменты в своем проекте:
Проверьте, есть ли у вас аннотации Spring и Swagger в вашем классе контроллера.
@RestController
@RequestMapping(value = "/order")
@ApiResponses({
@ApiResponse(code = 400, message = "Bad Request"),
@ApiResponse(code = 401, message = "Unauthorized"),
@ApiResponse(code = 403, message = "Forbidden"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 415, message = "Unsupported Media Type"),
@ApiResponse(code = 422, message = "Unprocessable Entity")
})
public class OrderController {
// Controller class code.
}
Затем проверьте, есть ли в вашей конечной точке также аннотации:
@PostMapping(
value = "/v1/new",
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
@ApiOperation(
value = "Create new Order.",
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
)
public ResponseEntity<String> newOrder(
@RequestHeader(name = "Content-type", defaultValue = "application/json;charset=UTF-8")
@NonNull final String contentType,
@RequestBody @NotNull @Valid OrderDTO orderDTO) {
// Endpoint code.
}
Конфигурация Swagger with
SpringBoot:
@EnableSwagger2
public class SwaggerConfig {
private static final String BASE_PACKAGE = "com.example.api";
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage(BASE_PACKAGE))
.paths(any())
.build()
.consumes(getContentType())
.produces(getContentType())
.apiInfo(getApiInfo());
}
private Set<String> getContentType() {
final HashSet<String> mediaType = new HashSet<>();
mediaType.add(MediaType.APPLICATION_JSON_UTF8_VALUE);
return mediaType;
}
private ApiInfo getApiInfo() {
return new ApiInfo(
//...
);
}
}
Конфигурация Swagger without
SpringBoot:
Добавьте: @Configuration
, extends WebMvcConfigurationSupport
и переопределите метод addResourceHandlers
в вашем классе SwaggerConfig.
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {
@Bean
public Docket api() {
//...
}
private ApiInfo getApiInfo() {
return new ApiInfo(
//...
);
}
@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/");
}
}
Комментарии:
1. Да, у меня есть тот же код, который вы предложили @Juliano. Я думаю, что проблема не в конфигурации swagger. Я предполагаю, что мой api-docs json неверен, поскольку в json-ответе swagger есть тег json (см. iamge swagger-json). спасибо за ответ, Джулиано