首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smallrye开放api拦截器

Smallrye开放api拦截器
EN

Stack Overflow用户
提问于 2021-01-23 22:56:46
回答 2查看 230关注 0票数 0

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

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

代码语言:javascript
复制
@GET
@RequiresBankHeader
public int get(
        @HeaderParam("bank")
        @Parameter(ref = "#/components/parameters/banks")
                String bank) {        
    return someService.getSomeInformation();
}

有一个提供程序截获此调用,并使用header参数中的信息执行一些例程。

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

但我也想创建一个拦截器来动态添加,只要有RequiresBankHeader注解,就执行OpenApi定义。

有办法做到这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-12 19:33:31

正如Roberto Cortez所提到的,MP OpenAPI规范提供了一种向openapi.yml文件提供元数据的编程方法。

不可能在JAX-RS端点定义中检测到注释,但它足以自动完成我所需的操作。因为所有具有RequiresBankHeader的方法都返回相同的模式,所以我能够像这样破解它:

代码语言:javascript
复制
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;
}

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

票数 0
EN

Stack Overflow用户

发布于 2021-01-29 23:57:38

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

代码语言:javascript
复制
@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();}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65860644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档