From 442dcea67bdc5a7a1ac6b1ea8f2253a7d07ca887 Mon Sep 17 00:00:00 2001 From: altro3 Date: Thu, 7 Nov 2024 12:32:11 +0700 Subject: [PATCH] Add support spring `server.servlet.context-path` and `spring.webflux.base-path` properties --- .../openapi/view/AbstractViewConfig.java | 5 +- .../openapi/view/OpenApiViewConfig.java | 6 +- .../openapi/visitor/ConfigUtils.java | 19 +++++ .../visitor/OpenApiConfigProperty.java | 8 ++ .../micronaut/openapi/visitor/UrlUtils.java | 3 +- .../OpenApiOperationViewRenderSpec.groovy | 51 ++++++++++++- .../OpenApiControllerVisitorSpec.groovy | 74 +++++++++++++++++++ 7 files changed, 152 insertions(+), 14 deletions(-) diff --git a/openapi/src/main/java/io/micronaut/openapi/view/AbstractViewConfig.java b/openapi/src/main/java/io/micronaut/openapi/view/AbstractViewConfig.java index 68d4136526..fe0244c8bd 100644 --- a/openapi/src/main/java/io/micronaut/openapi/view/AbstractViewConfig.java +++ b/openapi/src/main/java/io/micronaut/openapi/view/AbstractViewConfig.java @@ -138,10 +138,7 @@ protected String getFinalUrlPrefix(OpenApiViewConfig.RendererType rendererType, } // process micronaut.server.context-path - String contextPath = ConfigUtils.getConfigProperty(MICRONAUT_SERVER_CONTEXT_PATH, context); - if (contextPath == null) { - contextPath = StringUtils.EMPTY_STRING; - } + String contextPath = ConfigUtils.getServerContextPath(context); finalUrl += contextPath.startsWith(SLASH) ? contextPath.substring(1) : contextPath; if (!finalUrl.endsWith(SLASH)) { finalUrl += SLASH; diff --git a/openapi/src/main/java/io/micronaut/openapi/view/OpenApiViewConfig.java b/openapi/src/main/java/io/micronaut/openapi/view/OpenApiViewConfig.java index db881b6b36..74d70dba34 100644 --- a/openapi/src/main/java/io/micronaut/openapi/view/OpenApiViewConfig.java +++ b/openapi/src/main/java/io/micronaut/openapi/view/OpenApiViewConfig.java @@ -51,7 +51,6 @@ import static io.micronaut.openapi.visitor.FileUtils.readFile; import static io.micronaut.openapi.visitor.FileUtils.resolve; import static io.micronaut.openapi.visitor.OpenApiConfigProperty.MICRONAUT_OPENAPI_CONTEXT_SERVER_PATH; -import static io.micronaut.openapi.visitor.OpenApiConfigProperty.MICRONAUT_SERVER_CONTEXT_PATH; import static io.micronaut.openapi.visitor.StringUtil.COMMA; import static io.micronaut.openapi.visitor.StringUtil.DOLLAR; import static io.micronaut.openapi.visitor.StringUtil.SLASH; @@ -436,10 +435,7 @@ public String getSpecURL(AbstractViewConfig cfg, @Nullable VisitorContext contex } // process micronaut.server.context-path - String contextPath = ConfigUtils.getConfigProperty(MICRONAUT_SERVER_CONTEXT_PATH, context); - if (contextPath == null) { - contextPath = StringUtils.EMPTY_STRING; - } + String contextPath = ConfigUtils.getServerContextPath(context); finalUrl += contextPath.startsWith(SLASH) ? contextPath.substring(1) : contextPath; if (!finalUrl.endsWith(SLASH)) { finalUrl += SLASH; diff --git a/openapi/src/main/java/io/micronaut/openapi/visitor/ConfigUtils.java b/openapi/src/main/java/io/micronaut/openapi/visitor/ConfigUtils.java index 8540d199e1..14e261a922 100644 --- a/openapi/src/main/java/io/micronaut/openapi/visitor/ConfigUtils.java +++ b/openapi/src/main/java/io/micronaut/openapi/visitor/ConfigUtils.java @@ -105,7 +105,10 @@ import static io.micronaut.openapi.visitor.OpenApiConfigProperty.MICRONAUT_OPENAPI_SECURITY_ENABLED; import static io.micronaut.openapi.visitor.OpenApiConfigProperty.MICRONAUT_OPENAPI_SWAGGER_FILE_GENERATION_ENABLED; import static io.micronaut.openapi.visitor.OpenApiConfigProperty.MICRONAUT_OPENAPI_VERSIONING_ENABLED; +import static io.micronaut.openapi.visitor.OpenApiConfigProperty.MICRONAUT_SERVER_CONTEXT_PATH; import static io.micronaut.openapi.visitor.OpenApiConfigProperty.OPENAPI_CONFIG_FILE; +import static io.micronaut.openapi.visitor.OpenApiConfigProperty.SPRING_SERVER_CONTEXT_PATH; +import static io.micronaut.openapi.visitor.OpenApiConfigProperty.SPRING_WEBFLUX_BASE_PATH; import static io.micronaut.openapi.visitor.StringUtil.COMMA; import static io.micronaut.openapi.visitor.StringUtil.DOT; import static io.micronaut.openapi.visitor.StringUtil.UNDERSCORE; @@ -252,6 +255,22 @@ private static String getClassNameWithGenerics(String className, Map buildUrls(List segments, VisitorContext cont prevSegment = segment; } - String contextPath = ConfigUtils.getConfigProperty(MICRONAUT_SERVER_CONTEXT_PATH, context); + String contextPath = ConfigUtils.getServerContextPath(context); if (StringUtils.isNotEmpty(contextPath)) { if (!contextPath.startsWith(SLASH) && !contextPath.startsWith(DOLLAR)) { contextPath = SLASH + contextPath; diff --git a/openapi/src/test/groovy/io/micronaut/openapi/view/OpenApiOperationViewRenderSpec.groovy b/openapi/src/test/groovy/io/micronaut/openapi/view/OpenApiOperationViewRenderSpec.groovy index d4c2230b98..c9a92831c3 100755 --- a/openapi/src/test/groovy/io/micronaut/openapi/view/OpenApiOperationViewRenderSpec.groovy +++ b/openapi/src/test/groovy/io/micronaut/openapi/view/OpenApiOperationViewRenderSpec.groovy @@ -300,6 +300,7 @@ class OpenApiOperationViewRenderSpec extends Specification { indexHtml.contains('clientSecret: "bar"') } + @RestoreSystemProperties void "test generates urlResourcesPrefix context-path and openapi.context.path"() { given: System.setProperty(OpenApiConfigProperty.MICRONAUT_SERVER_CONTEXT_PATH, "/local-path") @@ -321,10 +322,54 @@ class OpenApiOperationViewRenderSpec extends Specification { urlPrefix urlPrefix == '/server-context-path/local-path/swagger-ui/res/' + } - cleanup: - System.clearProperty(OpenApiConfigProperty.MICRONAUT_SERVER_CONTEXT_PATH) - System.clearProperty(OpenApiConfigProperty.MICRONAUT_OPENAPI_CONTEXT_SERVER_PATH) + @RestoreSystemProperties + void "test generates urlResourcesPrefix spring context-path and openapi.context.path"() { + given: + System.setProperty(OpenApiConfigProperty.SPRING_SERVER_CONTEXT_PATH, "/local-path") + System.setProperty(OpenApiConfigProperty.MICRONAUT_OPENAPI_CONTEXT_SERVER_PATH, "/server-context-path") + String spec = "swagger-ui.enabled=true" + OpenApiViewConfig cfg = OpenApiViewConfig.fromSpecification(spec, null, new Properties(), null) + Path outputDir = Paths.get("output") + cfg.title = "OpenAPI documentation" + cfg.specFile = "swagger.yml" + cfg.render(outputDir, null) + + expect: + cfg.enabled + cfg.swaggerUIConfig != null + cfg.title == "OpenAPI documentation" + cfg.specFile == "swagger.yml" + + String urlPrefix = cfg.swaggerUIConfig.getFinalUrlPrefix(OpenApiViewConfig.RendererType.SWAGGER_UI, null) + + urlPrefix + urlPrefix == '/server-context-path/local-path/swagger-ui/res/' + } + + @RestoreSystemProperties + void "test generates urlResourcesPrefix spring webflux context-path and openapi.context.path"() { + given: + System.setProperty(OpenApiConfigProperty.SPRING_WEBFLUX_BASE_PATH, "/local-path") + System.setProperty(OpenApiConfigProperty.MICRONAUT_OPENAPI_CONTEXT_SERVER_PATH, "/server-context-path") + String spec = "swagger-ui.enabled=true" + OpenApiViewConfig cfg = OpenApiViewConfig.fromSpecification(spec, null, new Properties(), null) + Path outputDir = Paths.get("output") + cfg.title = "OpenAPI documentation" + cfg.specFile = "swagger.yml" + cfg.render(outputDir, null) + + expect: + cfg.enabled + cfg.swaggerUIConfig != null + cfg.title == "OpenAPI documentation" + cfg.specFile == "swagger.yml" + + String urlPrefix = cfg.swaggerUIConfig.getFinalUrlPrefix(OpenApiViewConfig.RendererType.SWAGGER_UI, null) + + urlPrefix + urlPrefix == '/server-context-path/local-path/swagger-ui/res/' } void "test generates urlResourcesPrefix only context-path"() { diff --git a/openapi/src/test/groovy/io/micronaut/openapi/visitor/OpenApiControllerVisitorSpec.groovy b/openapi/src/test/groovy/io/micronaut/openapi/visitor/OpenApiControllerVisitorSpec.groovy index c2bfdb299b..6ad1a47ecd 100644 --- a/openapi/src/test/groovy/io/micronaut/openapi/visitor/OpenApiControllerVisitorSpec.groovy +++ b/openapi/src/test/groovy/io/micronaut/openapi/visitor/OpenApiControllerVisitorSpec.groovy @@ -2483,6 +2483,80 @@ class TestController { } } +@Singleton +class MyBean {} +''') + when: + OpenAPI openAPI = Utils.testReference + def paths = openAPI.paths + + then: + paths + paths."/server-context-path/local-path/test/save" + paths."/server-context-path/local-path/test/save".get + paths."/server-context-path/local-path/test/save/{id}" + paths."/server-context-path/local-path/test/save/{id}".get + } + + @RestoreSystemProperties + void "test append spring server.servlet.context-path to endpoints"() { + given: + System.setProperty(OpenApiConfigProperty.SPRING_SERVER_CONTEXT_PATH, "/local-path") + System.setProperty(OpenApiConfigProperty.MICRONAUT_OPENAPI_CONTEXT_SERVER_PATH, "/server-context-path") + + buildBeanDefinition('test.MyBean', ''' +package test; + +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import jakarta.inject.Singleton; + +@Controller("/test") +class TestController { + + @Get("/save{/id}") + String save() { + return null; + } +} + +@Singleton +class MyBean {} +''') + when: + OpenAPI openAPI = Utils.testReference + def paths = openAPI.paths + + then: + paths + paths."/server-context-path/local-path/test/save" + paths."/server-context-path/local-path/test/save".get + paths."/server-context-path/local-path/test/save/{id}" + paths."/server-context-path/local-path/test/save/{id}".get + } + + @RestoreSystemProperties + void "test append spring spring.webflux.base-path to endpoints"() { + given: + System.setProperty(OpenApiConfigProperty.SPRING_WEBFLUX_BASE_PATH, "/local-path") + System.setProperty(OpenApiConfigProperty.MICRONAUT_OPENAPI_CONTEXT_SERVER_PATH, "/server-context-path") + + buildBeanDefinition('test.MyBean', ''' +package test; + +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import jakarta.inject.Singleton; + +@Controller("/test") +class TestController { + + @Get("/save{/id}") + String save() { + return null; + } +} + @Singleton class MyBean {} ''')