Spring Boot + Jersey 上的 Swagger routes return 404
Swagger routes return 404 on Spring Boot + Jersey
我正在尝试将 Swagger 添加到现有 spring 引导应用程序中,如 this 教程中所述。
我的主要应用class如下:
@SpringBootApplication
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Swagger 配置为:
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}
我可以看到 Spring 显然识别了 Swagger 及其在启动日志中的路由:
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/v2/api-docs],methods=[GET],produces=[application/json || application/hal+json]}" onto public org.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json> springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/configuration/ui]}" onto org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.UiConfiguration> springfox.documentation.swagger.web.ApiResourceController.uiConfiguration()
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/configuration/security]}" onto org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.SecurityConfiguration> springfox.documentation.swagger.web.ApiResourceController.securityConfiguration()
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/swagger-resources]}" onto org.springframework.http.ResponseEntity<java.util.List<springfox.documentation.swagger.web.SwaggerResource>> springfox.documentation.swagger.web.ApiResourceController.swaggerResources()
但是当尝试访问 http://localhost:8080/v2/api-docs
时,我得到一个普通的 404 作为响应。
我能在网上找到的所有类似问题都指的是人们不使用 Spring 引导并且必须手动映射资源(也在同一教程 link 中描述),但这不会我的情况。
有任何解决方法或 - 至少 - 在哪里进行调查的想法吗?
我发现问题与 jersey 的应用程序路径配置有关。在我的例子中,通过以下注释:
@Component
@ApplicationPath("/") //WRONG
@Configuration
public class JerseyConfiguration extends ResourceConfig {
...
}
@ApplicationPath 配置会覆盖 Jersey 本身发布的任何路由(如 whitelabel /error
)或第三方库(在本例中为 /v2/api-docs
、/configuration/ui
、/configuration/security
和 /swagger-resources
来自招摇)。仅使用 /
作为路径强制使用我的应用程序中的自定义控制器严格解析请求。
将 @ApplicationPath
限制为应用程序服务的实际路径(在我的例子中 /api
)将允许 jersey 将其他路由绑定到自动生成的控制器:
@Component
@ApplicationPath("/api") //RIGHT
@Configuration
public class JerseyConfiguration extends ResourceConfig {
...
}
我正在尝试将 Swagger 添加到现有 spring 引导应用程序中,如 this 教程中所述。
我的主要应用class如下:
@SpringBootApplication
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Swagger 配置为:
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}
我可以看到 Spring 显然识别了 Swagger 及其在启动日志中的路由:
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/v2/api-docs],methods=[GET],produces=[application/json || application/hal+json]}" onto public org.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json> springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/configuration/ui]}" onto org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.UiConfiguration> springfox.documentation.swagger.web.ApiResourceController.uiConfiguration()
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/configuration/security]}" onto org.springframework.http.ResponseEntity<springfox.documentation.swagger.web.SecurityConfiguration> springfox.documentation.swagger.web.ApiResourceController.securityConfiguration()
s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/swagger-resources]}" onto org.springframework.http.ResponseEntity<java.util.List<springfox.documentation.swagger.web.SwaggerResource>> springfox.documentation.swagger.web.ApiResourceController.swaggerResources()
但是当尝试访问 http://localhost:8080/v2/api-docs
时,我得到一个普通的 404 作为响应。
我能在网上找到的所有类似问题都指的是人们不使用 Spring 引导并且必须手动映射资源(也在同一教程 link 中描述),但这不会我的情况。
有任何解决方法或 - 至少 - 在哪里进行调查的想法吗?
我发现问题与 jersey 的应用程序路径配置有关。在我的例子中,通过以下注释:
@Component
@ApplicationPath("/") //WRONG
@Configuration
public class JerseyConfiguration extends ResourceConfig {
...
}
@ApplicationPath 配置会覆盖 Jersey 本身发布的任何路由(如 whitelabel /error
)或第三方库(在本例中为 /v2/api-docs
、/configuration/ui
、/configuration/security
和 /swagger-resources
来自招摇)。仅使用 /
作为路径强制使用我的应用程序中的自定义控制器严格解析请求。
将 @ApplicationPath
限制为应用程序服务的实际路径(在我的例子中 /api
)将允许 jersey 将其他路由绑定到自动生成的控制器:
@Component
@ApplicationPath("/api") //RIGHT
@Configuration
public class JerseyConfiguration extends ResourceConfig {
...
}