我正在开发一个rest应用程序。
一些端点需要一个与授权无关的自定义标头参数。我使用jax-rs NameBinding创建了一个自定义注释。下面是一个使用示例:
@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定义。
有办法做到这一点吗?
发布于 2021-02-12 19:33:31
正如Roberto Cortez所提到的,MP OpenAPI规范提供了一种向openapi.yml文件提供元数据的编程方法。
不可能在JAX-RS端点定义中检测到注释,但它足以自动完成我所需的操作。因为所有具有RequiresBankHeader的方法都返回相同的模式,所以我能够像这样破解它:
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
发布于 2021-01-29 23:57:38
我认为您不能使用拦截器来修改生成的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();}
}https://stackoverflow.com/questions/65860644
复制相似问题