开放自由和 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.
我无法找出为什么我的其余 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.