Java中能否引用注解实例减少Swagger注解的重复冗余代码?
Swagger注解配置复用解决方案
Java语言本身不支持将注解存为静态变量后直接用于标注的写法,注解仅支持在固定位置标注,也不具备多态特性,因此需要基于Swagger/OpenAPI本身提供的能力实现配置复用,以下是两种可覆盖你需求的实现方案:
方案1:自定义元注解 + 调整注解标注位置
你之前的元注解思路是可行的,Swagger本身支持识别标注在方法上的自定义元注解内的@Parameter配置,无需硬塞到@Operation的parameters数组中:
- 调整自定义注解的
@Target增加METHOD类型,内置通用的@Parameter配置:
@Target({PARAMETER, METHOD, FIELD, ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Parameter( description = "Some long long description", required = true, schema = @Schema(allowableValues = {"abc", "def", "hij"}, defaultValue = "abc"), in = ParameterIn.QUERY, name = "foo" ) public @interface FooQueryParam { }
- 使用时直接将自定义注解标注在方法上,和
@Operation平级即可,Swagger会自动将其识别为接口参数,和@Operation内的参数配置合并:
@FooQueryParam // 直接标注在方法上即可生效 @Operation( parameters = { @Parameter(in = ParameterIn.QUERY, name = "bar") } ) public Response myAPINope( @QueryParam("foo") String foo, @QueryParam("bar") String bar) { return null; } // 也可以正常标注在方法参数上 public Response myAPI01( @FooQueryParam @QueryParam("foo") String foo) { return null; }
方案2:通过$ref引用全局公共参数定义
如果是全项目复用的公共参数,更推荐基于OpenAPI 3的全局组件引用能力实现,配置和业务代码解耦,修改时仅需调整一次全局配置:
- 先在OpenAPI全局配置中定义公共参数:
@Bean public OpenAPI customOpenAPI() { return new OpenAPI() .components(new Components() .addParameters("fooCommonParam", new Parameter() .description("Some long long description") .required(true) .schema(new StringSchema()._enum(List.of("abc", "def", "hij"))._default("abc")) .in(ParameterIn.QUERY.toString()) .name("foo") )) .info(new Info().title("接口文档").version("1.0")); }
- 任意位置直接通过
ref属性引用即可,同时支持写在@Operation的parameters数组和方法参数上:
// 用于@Operation的parameters数组 @Operation( parameters = { @Parameter(ref = "#/components/parameters/fooCommonParam"), @Parameter(in = ParameterIn.QUERY, name = "bar") } ) public Response myAPINope( @QueryParam("foo") String foo, @QueryParam("bar") String bar) { return null; } // 用于方法参数标注 public Response myAPI01( @Parameter(ref = "#/components/parameters/fooCommonParam") @QueryParam("foo") String foo) { return null; }
内容的提问来源于stack exchange,提问作者Paul C
相关产品推荐
相关产品推荐

