Smallrye 开启 api 拦截器
Smallrye open api interceptor
我正在开发一个休息应用程序。
一些端点需要自定义 header 参数,与授权无关。我使用 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/banks") String bank',这样它就会出现在 Swagger 中,即使服务 类 不需要它。我至少能够重用带有 ref = "#/components/parameters/banks" 的参数定义,并在 OpenAPI.yml 文件中声明它,Quarkus 与生成的代码很好地合并。
但我也想创建和拦截器以在 RequiresBankHeader 注释存在时动态添加此 OpenApi 定义。
有办法吗?
我认为您不能使用拦截器来修改生成的 Openapi 模式输出。
如果给定端点上的所有方法都需要一些参数,您可以在 class 级别指定它,如下所示:
@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();}
}
正如 Roberto Cortez 所提到的,MP OpenAPI 规范提供了一种向 openapi.yml 文件提供元数据的编程方式。
无法在 JAX-RS 端点定义中检测到注释,但它足以自动执行我需要的操作。由于所有具有 RequiresBankHeader return 相同架构的方法,我能够像这样破解它:
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
我正在开发一个休息应用程序。
一些端点需要自定义 header 参数,与授权无关。我使用 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/banks") String bank',这样它就会出现在 Swagger 中,即使服务 类 不需要它。我至少能够重用带有 ref = "#/components/parameters/banks" 的参数定义,并在 OpenAPI.yml 文件中声明它,Quarkus 与生成的代码很好地合并。
但我也想创建和拦截器以在 RequiresBankHeader 注释存在时动态添加此 OpenApi 定义。
有办法吗?
我认为您不能使用拦截器来修改生成的 Openapi 模式输出。 如果给定端点上的所有方法都需要一些参数,您可以在 class 级别指定它,如下所示:
@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();}
}
正如 Roberto Cortez 所提到的,MP OpenAPI 规范提供了一种向 openapi.yml 文件提供元数据的编程方式。
无法在 JAX-RS 端点定义中检测到注释,但它足以自动执行我需要的操作。由于所有具有 RequiresBankHeader return 相同架构的方法,我能够像这样破解它:
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