开放自由和 openapi(/ui) 和 "no operations defined in spec!"

open-liberty and openapi(/ui) and "no operations defined in spec!"

我无法找出为什么我的其余 api 端点在 openapi/ui 中使用 openliberty 不可见/不可执行。 openapi/ui 报告“规范中没有定义任何操作!”我的项目由一个空应用程序 class 和一个带有单个端点的普通 rest 控制器组成:

package sandbox.io.rest;

import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;

@ApplicationPath("/api")
public class RestApplication extends Application { }
package sandbox.io.rest;

import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;

@ApplicationScoped
public class RestController
{
    @GET
    @Path("/system/properties")
    @Produces(APPLICATION_JSON)
    public Response getSystemProperties()
    {
        return Response.ok(System.getProperties()).build();
    }
}

我的 server.xml 中激活了以下功能:

    <featureManager>
        <feature>jakartaee-9.1</feature>
        <feature>microProfile-5.0</feature>
<!--        <feature>restfulWS-3.0</feature> -->
<!--        <feature>jsonp-2.0</feature> -->
<!--        <feature>jsonb-2.0</feature> -->
<!--        <feature>cdi-3.0</feature> -->
<!--        <feature>mpConfig-3.0</feature> -->
<!--        <feature>mpRestClient-3.0</feature> -->
<!--        <feature>mpOpenAPI-3.0</feature> -->
    </featureManager>

一切都是从 openliberty/get 开始生成的。

有一个真正的最小复制器here

我也试过激活 mpOpenAPI-3.0 功能,但无法使其工作。有人可以看看复制器吗?

顺便说一句:请不要被回购名称激怒,我只是尝试为 openliberty、hibernate 和 postgres 设置一个环境......但是我想使用 openapi/ui,也是。

您可以通过添加 class-level @Path 注释来解决此问题。要保持聚合 URL 路径相同,您可以 @Path("/") 这样做:

@Path("/")
@ApplicationScoped
public class RestController
{
    @GET
    @Path("/system/properties")
    @Produces(APPLICATION_JSON)
    public Response getSystemProperties()
    {
        return Response.ok(System.getProperties()).build();
    }
}

我认为这更像是雅加达 RESTful 问题,而不是 MicroProfile OpenAPI 问题。

除了 Scott Kurz 的回答:

OpenAPI 找不到端点的原因是因为没有 @PATH 注释(或 @Provider),您的 RestController class 未在 JAX-RS 运行时。一种较早的注册方式是从 RestApplication.getClasses() 到 return RestController.class。但是,这不如注释端点动态 class.