У меня есть программное обеспечение, которое выполняет две разные задачи:
- Допустим, задача приложения
- Задача API остальных
Задача приложения на базовый контекст {host} / application /... инициализируется с помощью Springboot следующим образом:
public static void main(String[] args) {
new SpringApplicationBuilder(ApplicationStarter.class).properties(Properties.loadPortProperty()).run(args);
}
@Bean
public ServletRegistrationBean endpoint() {
return new ServletRegistrationBean(new ApplicationServlet(), "/application/*");
}
Задача rest api, содержащая swagger, настраивается следующим образом (конечные точки остальных api я думаю, что в данный момент не требуется):
<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>
@Controller
@RequestMapping("/api")
public class HomeController {
@ApiIgnore
@GetMapping(value = "")
public void index(HttpServletResponse response) throws IOException {
response.sendRedirect("/api/swagger-ui.html");
}
}
@Configuration
@EnableSwagger2
public class SwaggerDocumentationConfig implements WebMvcConfigurer {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.select()
.apis(RequestHandlerSelectors.basePackage("test.package"))
.paths(PathSelectors.any())
.build();
}
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/api/swagger-ui.html**")
.addResourceLocations("classpath:/META-INF/resources/swagger-ui.html");
registry.addResourceHandler("/api/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/api/v2/api-docs", "/v2/api-docs");
registry.addRedirectViewController("/api/swagger-resources/configuration/security", "/swagger-resources/configuration/security");
registry.addRedirectViewController("/api/swagger-resources/configuration/ui", "/swagger-resources/configuration/ui");
registry.addRedirectViewController("/api/swagger-resources", "/swagger-resources");
}
}
Так что эта конфигурация отлично работает на моей локальной машине. Проблема в том, что если эта конфигурация работает за обратным прокси-сервером, я не могу связаться с swagger-ui. html из-за перенаправления на swagger без / api / достигает совершенно другого развертывания (например, другого веб-интерфейса) ). В результате браузер показывает для / api / swagger-ui. html ошибку http 404 соответственно и Невозможно вывести базовый URL-адрес сообщение.
Если я установил / api / через файл application.properties под ресурсами проекта, проблема заключается в том, что первая задача (задача приложения) меняет свой базовый контекст на / api / application /..., который не нужен ... но если я сделаю это, пользовательский интерфейс работает так, как задумано.
Поэтому мой вопрос заключается в том, как сказать всему развертыванию Swagger, что он должен использовать базу контекстный путь / api / , а не / ?
Спасибо за вашу поддержку, и я надеюсь, что понятно, в чем проблема:)