【问题标题】:Smallrye open api interceptorSmallrye 开放 api 拦截器
【发布时间】:2021-01-23 14:56:46
【问题描述】:

我正在开发一个休息应用程序。

某些端点需要自定义标头参数,与授权无关。我使用 jax-rs NameBinding 创建了一个自定义注释。这是一个使用示例:

@GET
@RequiresBankHeader
public int get(
        @HeaderParam("bank")
        @Parameter(ref = "#/components/parameters/banks")
                String bank) {        
    return someService.getSomeInformation();
}

有一个提供者拦截这个调用并使用头参数中的信息执行一些例程。

问题是我必须在各处重复 '@HeaderParam("bank") @Parameter(ref = "#/components/parameters/banks") String bank',即使它出现在 Swagger 中,即使服务类不需要它。我至少能够使用 ref = "#/components/parameters/banks" 重用参数定义,并在 OpenAPI.yml 文件中声明它,Quarkus 与生成的代码很好地合并。

但我还想创建和拦截器,以便在存在 RequiresBankHeader 注释时动态添加 OpenApi 定义。

有办法吗?

【问题讨论】:

标签: swagger openapi quarkus microprofile smallrye


【解决方案1】:

我认为您不能使用拦截器来修改生成的 Openapi 模式输出。 如果给定端点上的所有方法都需要一些参数,您可以像这样在类级别指定它:

@Path("/someendpoint")
public class MyEndpoint {
  
    @HeaderParam("bank")
    @Parameter(name = "bank")
    String bank;

    @GET
    public Response getAll() {return Response.ok().build()}

    @GET
    @Path("{id}")
    public Response someMethod(@PathParam("id") String id) {return Response.ok().build();}
}

【讨论】:

    【解决方案2】:

    正如 Roberto Cortez 所述,MP OpenAPI 规范提供了一种将元数据贡献给 openapi.yml 文件的编程方式。

    无法在 JAX-RS 端点定义中检测到注释,但它足以自动化我需要的东西。由于所有具有 RequiresBankHeader 的方法都返回相同的 Schema,因此我能够像这样破解它:

    public class OpenApiConfigurator implements OASFilter {
    
    @Override
    public Operation filterOperation(Operation operation) {
        operation.getResponses().getAPIResponses().values().stream().
                map(APIResponse::getContent).
                filter(Objects::nonNull).
                map(Content::getMediaTypes).
                flatMap(mediaTypes -> mediaTypes.values().stream()).
                map(MediaType::getSchema).
                filter(Objects::nonNull).
                map(Schema::getRef).
                filter(Objects::nonNull).
                filter(ref -> ref.contains("the common response schema")).
                findAny().
                ifPresent(schema -> {
                    ParameterImpl parameter = new ParameterImpl();
                    parameter.setRef("#/components/parameters/banks");
                    operation.addParameter(parameter);
                });
        return operation;
    }
    

    应在应用程序属性中配置 OpenApiConfigurator,使用 mp.openapi.filter=com.yourcompany.OpenApiConfigurator

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2014-03-10
      • 2013-06-25
      • 2018-08-09
      • 2016-08-31
      相关资源
      最近更新 更多