2

我在 Wildfly 应用程序中集成了 Swagger-ui。

该项目是通过 maven 配置的,具有以下(相关)依赖项:

    <dependency>
      <groupId>io.swagger.core.v3</groupId>
      <artifactId>swagger-jaxrs2</artifactId>
      <version>2.0.0</version>
    </dependency>
    <dependency>
      <groupId>io.swagger.core.v3</groupId>
      <artifactId>swagger-jaxrs2-servlet-initializer</artifactId>
      <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>swagger-ui</artifactId>
        <version>3.23.2</version>
    </dependency>

我还从 webjar 中提取了 swagger-ui.html 页面并自定义了 javascript 以连接到我的服务器,如下所示(请参阅 url):

window.onload = function() {
  // Begin Swagger UI call region
  const ui = SwaggerUIBundle({
    url: "doc/openapi.json",
    dom_id: "#swagger-ui",
    deepLinking: true,
    presets: [
      SwaggerUIBundle.presets.apis,
      SwaggerUIStandalonePreset
    ],
    plugins: [
      SwaggerUIBundle.plugins.DownloadUrl
    ],
    layout: "StandaloneLayout"
  })
  // End Swagger UI call region

  window.ui = ui
}

swagger-ui 运行良好,它显示了我的端点列表。但是当我尝试连接到我的端点时,它会失败,因为用于连接的 url 不包含我的应用程序的上下文路径(此处为myApp),它尝试连接:

curl -X GET "http://localhost:8080/aop/hello/version" -H "accept: */*"

但它应该是:

curl -X GET "http://localhost:8080/myApp/aop/hello/version" -H "accept: */*"

我发现缺少的部分被命名为 basePath,但我没有找到任何解决方案将它添加到我的 Wildfly 应用程序中。

更新: 按照文档,似乎 basePath 来自 Swagger,OpenApi 使用服务器。然后我尝试了:

@ApplicationPath("/api")
public class ApplicationConfig extends Application 
{
    public ApplicationConfig(@Context ServletConfig servletConfig) {
        // Swagger Configuration
        super();
        OpenAPI oas = new OpenAPI()
                .servers(Collections.singletonList(new Server().url("http://localhost:8080/my_app")));
        Info info = new Info()
                .title("Swagger");

        oas.info(info);
        SwaggerConfiguration oasConfig = new SwaggerConfiguration()
                .openAPI(oas)
                .prettyPrint(true);

        try {
            new JaxrsOpenApiContextBuilder<>()
                    .servletConfig(servletConfig)
                    .application(this)
                    .openApiConfiguration(oasConfig)
                    .buildContext(true);
        } catch (OpenApiConfigurationException e) {
            throw new ConfigurationException(e.getMessage(), e);
        }
    }
}

但它仍然没有被考虑在内。

有铅吗?

谢谢 :-)

4

3 回答 3

3

最后,我让它工作了,但不是使用未考虑的 Java 配置(在调试中看到),而是在应用程序的类路径中使用配置文件openapi.yaml

该文件如下所示:

prettyPrint: true
cacheTTL: 0
openAPI:
  servers:
    - url: /my_app
  info:
    version: '1.0'
    title: Swagger application

现在正确处理了服务器 url。

但我仍然很想知道 Java 配置的正确解决方案是什么。

于 2019-08-09T13:34:36.687 回答
1

在全局级别提供,它在 java 中运行良好

@OpenAPIDefinition(servers = @Server(url="/my_app"))
@ApplicationPath("api")
public class ApplicationConfig extends Application {
}
于 2020-06-08T13:48:15.150 回答
0

我遇到了同样的问题,出于某种原因,您使用 openapi.yaml 的解决方案也对我不起作用。

然后我发现您可以将 Server 注释与您的服务/资源类一起使用:

@Path("/myservice")
@Server(url="/my_app")
public interface MyService {
...
}
于 2020-05-07T10:43:35.603 回答