You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 11 Quarkus中如何自定义注解合并重复@APIResponse?

方案可行性与实现步骤

这个方案完全可行,Quarkus 2.9.2 基于的SmallRye OpenAPI支持通过自定义组合注解来复用重复的@APIResponse配置,这是减少接口文档注解冗余的常用手段。

1. 自定义组合注解@APIResponses40X

创建一个新的注解类,用@APIResponses包裹你需要复用的三个@APIResponse,同时指定注解的保留策略和作用目标:

import io.swagger.v3.oas.annotations.responses.APIResponse;
import io.swagger.v3.oas.annotations.responses.APIResponses;
import jakarta.ws.rs.core.MediaType;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 指定注解可作用在方法或类上
@Target({ElementType.METHOD, ElementType.TYPE})
// 保留到运行时,让OpenAPI处理器能识别解析
@Retention(RetentionPolicy.RUNTIME)
// 包裹需要复用的三个API响应配置
@APIResponses({
    @APIResponse(
        responseCode = "401",
        description = "Unauthorized",
        content = @io.swagger.v3.oas.annotations.media.Content(mediaType = MediaType.APPLICATION_JSON)
    ),
    @APIResponse(
        responseCode = "403",
        description = "Forbidden",
        content = @io.swagger.v3.oas.annotations.media.Content(mediaType = MediaType.APPLICATION_JSON)
    ),
    @APIResponse(
        responseCode = "404",
        description = "Not Found",
        content = @io.swagger.v3.oas.annotations.media.Content(mediaType = MediaType.APPLICATION_JSON)
    )
})
public @interface APIResponses40X {
}

如果更倾向于使用Quarkus适配的OpenAPI注解,也可以替换为io.quarkus.smallrye.openapi.runtime.api.annotations下的OpenAPIResponse和OpenAPIResponses,功能完全一致,适配性更好。

2. 在接口中使用自定义注解

在需要的REST接口方法或类上直接添加@APIResponses40X,即可替代原来的三个@APIResponse:

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/users")
public class UserResource {

    @GET
    @Path("/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    @APIResponses40X // 直接复用组合注解
    public User getUserById(String id) {
        // 业务逻辑实现
        return new User();
    }
}

3. 验证效果

启动Quarkus应用后,访问默认的OpenAPI文档页面(/q/openapi或/q/swagger-ui),可以看到目标接口已自动包含401、403、404这三个响应的文档描述,和直接添加三个@APIResponse的效果完全一致。

内容的提问来源于stack exchange,提问作者kadir_j

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:20:33