如何在Quarkus中使用接口进行REST API定义?

问题描述

我想针对接口使用JAX RS定义REST API,然后在服务器和任意数量的客户端中都实现此接口。除非您在实现中重复API定义的一部分,否则Quarkus似乎不支持功能

例如,应该可以执行以下操作:

@Path("/hello")
interface GreetingApi {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("/greeting/{name}")
    fun greeting(@PathParam("name") name: String): String?
}

class GreetingEndpoint(private val service: NameService) : GreetingApi {
    override fun greeting(name: String): String? {
        return service.greeting(name)
    }
}

@RegisterRestClient
interface GreetingClient : GreetingApi

但是,客户端和服务器都需要附加的@Path("/hello")批注才能注册(如果没有测试,则抛出404错误),这既多余又不必要。

是否可以仅在接口上定义完整的API?

解决方法

Jax-rs 2.0 将 jax-rs 资源 (3.1) 定义为至少具有 1 个 jax-rs 注释。当覆盖超类/接口注释时,所有注释都会被覆盖(例如,如果接口中存在 3 个注释,则覆盖其中的 1 个将丢弃其他 2 个)。该规范建议覆盖所有注释以与其他 EE 规范(在 3.6 中)保持一致。

以下应该有效:

@Path("/hello")
interface GreetingApi {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("/greeting/{name}")
    fun greeting(@PathParam("name") name: String): String?
}

@Path("/hello")
class GreetingEndpoint(private val service: NameService) : GreetingApi {
    override fun greeting(name: String): String? {
        return service.greeting(name)
    }
}

@RegisterRestClient
interface GreetingClient : GreetingApi