Открытый API-перехватчик Smallrye

Разрабатываю приложение для отдыха.

Некоторым конечным точкам требуется настраиваемый параметр заголовка, не связанный с авторизацией. Я создал специальную аннотацию, используя 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 очень хорошо сливается с сгенерированным кодом.

Но я также хочу создать перехватчик для динамического добавления этого определения OpenApi всякий раз, когда присутствует аннотация RequiresBankHeader.

Есть способ сделать это?


person AmsterdamLuis    schedule 23.01.2021    source источник
comment
Спецификация MP OpenAPI предоставляет программный способ добавления метаданных в файл openapi.yml. Не уверен, можно ли сделать это так, как вы хотите, но я, вероятно, начну с этого: github.com/eclipse/microprofile-open-api/blob/master/spec/src/   -  person Roberto Cortez    schedule 29.01.2021
comment
@RobertoCortez Спасибо. Эта ссылка привела меня к решению.   -  person AmsterdamLuis    schedule 12.02.2021


Ответы (2)


Я не думаю, что вы можете использовать перехватчики для изменения сгенерированного вывода схемы 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();}
}
person yntelectual    schedule 29.01.2021

Как упоминал Роберто Кортез, спецификация 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;
}

OpenApiConfigurator необходимо настроить в свойствах приложения, используя mp.openapi.filter = com.yourcompany.OpenApiConfigurator.

person AmsterdamLuis    schedule 12.02.2021