【问题标题】:swagger ui not accessible with micronaut multi-module project gradle buildswagger ui 无法通过 micronaut 多模块项目 gradle build 访问
【发布时间】:2020-10-18 11:54:39
【问题描述】:

我有一个下面的项目结构

项目产品和 API 网关共享通用项目。由于在父项目settings.Gradle中,我已经包含了如下项目

rootProject.name = 'src'
include 'common', 'fetebird-apigateway', 'fete-bird-product'

在 API 网关 build.gradle 中,我包含了以下依赖项

    dependencies {
        annotationProcessor("io.micronaut.openapi:micronaut-openapi:2.1.1")
        implementation("io.swagger.core.v3:swagger-annotations")
        implementation project(':common')
        }

在产品 build.gradle 中,我包含以下依赖项

dependencies {
         annotationProcessor("io.micronaut.openapi:micronaut-openapi:2.1.1") 
         implementation("io.swagger.core.v3:swagger-annotations")
         implementation project(':common')

        }

当我运行命令 $ gradle build 时,我可以看到视图已生成

大摇大摆地暴露终点

micronaut:
  application:
    name: feteBirdProduct
  server:
    port: 8083
  router:
    versioning:
      enabled: true
    static-resources:
      swagger:
        paths: classpath:META-INF/swagger
        mapping: /swagger/**
      swagger-ui:
        paths: classpath:META-INF/swagger/views/swagger-ui
        mapping: /swagger-ui/**

但是当我访问 URL 时

http://localhost:8084/swagger-ui/index.html

我可以看到以下消息,但我没有启用任何安全性

{"message":"Page Not Found","_links":{"self":{"href":"/swagger-ui/index.html","templated":false}}}

调试时io.micronaut.web.router.resource.StaticResourceResolverpublic URL findResource(String name) 在 BuiltinClassLoader.java 中返回 null

【问题讨论】:

    标签: java gradle swagger micronaut micronaut-openapi


    【解决方案1】:

    不确定您是否这样做了,但您可能需要使用 YML 配置将生成的 API 文档公开为静态资源,例如 Micronaut OpenAPI docs):

    micronaut:
        router:
            static-resources:
                swagger:
                    paths: classpath:META-INF/swagger
                    mapping: /swagger/**
    

    那么您应该能够使用以下路由访问它们:http://localhost:8080/swagger/views/swagger-ui/index.html

    如果您启用安全模块,您可能需要使用“intercept URL map”为该 URL 指定安全规则,否则您可能无法访问它:

    micronaut:
      security:
        intercept-url-map:
          - pattern: /swagger/**
            http-method: GET
            access:
              - isAnonymous()
    

    【讨论】:

    • 我已经这样做了,在我的yaml文件中,我已经暴露了swagger ui
    • 你能分享一下配置吗?在您的问题中,您说您试图通过 http://localhost:8084/swagger-ui/index.html 访问文档,如果配置与我发布的一样,那么 URL 中缺少一些路径片段,它应该显示为:http://localhost:8084/swagger/views/swagger-ui/index.html
    • 用配置更新问题,请看
    • 您已启用版本控制。你需要default-version吗?我不确定,我的想法已经不多了。您也可以尝试调试io.micronaut.web.router.resource.StaticResourceResolver 类,以检查是否找到了请求的资源。
    • 版本不是问题,你能看看这个 repo github.com/anandjaisy/micronautMultiproject。您可以运行 API 网关项目
    【解决方案2】:

    解决方案是包含每个项目的 setting.gradle 文件,但是在 Intellj 上,如果您导航到 Gradle 任务并运行构建,它会给您一个错误,或者如果您运行 gradle run 它会给您一个错误

    【讨论】:

      【解决方案3】:

      文档说enabled 标志的默认值为true,但出于某种原因,我必须明确设置this value 以显示招摇的用户界面。

      micronaut:
        router:
          static-resources:
            swagger:
              enabled: true  # docs says this is already the default value
              paths: classpath:META-INF/swagger
              mapping: /swagger/**
            swagger-ui:
              enabled: true  # but this only works if it is explicitly set
              paths: classpath:META-INF/swagger/views/swagger-ui
              mapping: /swagger-ui/**
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-13
        • 2021-02-01
        • 1970-01-01
        • 2018-06-08
        • 1970-01-01
        • 2014-07-01
        • 2020-06-26
        • 2020-11-10
        相关资源
        最近更新 更多