open-liberty 和 openapi(/ui) 以及“规范中没有定义任何操作!”

r-u*_*-uu 4 openapi open-liberty

我不明白为什么我的其余 api 端点在 openapi/ui 中使用 openliberty 不可见/可执行。openapi/ui 报告“规范中没有定义任何操作!” 我的项目由一个空的应用程序类和一个具有单个端点的简单休息控制器组成:

package sandbox.io.rest;

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

@ApplicationPath("/api")
public class RestApplication extends Application { }
Run Code Online (Sandbox Code Playgroud)
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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 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>
Run Code Online (Sandbox Code Playgroud)

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

这里有一个真正的最小再现器。

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

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

小智 10

除了斯科特·库尔兹的回答:https ://stackoverflow.com/a/71946440/8067386

OpenAPI 找不到端点的原因是因为如果没有注释@PATH(或@Provider),您的RestController类不会在 JAX-RS 运行时注册。一种较旧的注册方法是RestController.classRestApplication.getClasses(). 但是,这比注释端点类的动态性要低。


Sco*_*urz 5

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

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

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