Swagger - Контроллер не включен в OpenApi-Documentation - PullRequest
0 голосов
/ 07 мая 2020

У меня есть веб-служба JAX-RS, которую я хочу задокументировать с помощью Swagger 2.1.

Конфигурация встроена в мой сервлет:

public class FooWebservice extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        OpenAPI oas = new OpenAPI();
        Info info = new Info()
            .title("Foo-Webservice")
            .version("1.0.0");

        oas.info(info);

        SwaggerConfiguration oasConfig = new SwaggerConfiguration()
            .prettyPrint(true)
            .openAPI(oas)
            .resourcePackages(Stream.of("de.kembytes.foo.webservice.controller").collect(Collectors.toSet()));

        try {
            new JaxrsOpenApiContextBuilder()
                .servletConfig(config)
                .openApiConfiguration(oasConfig)
                .buildContext(true);
        } catch (OpenApiConfigurationException e) {
            throw new ServletException(e.getMessage(), e);
        }
    }
}

Вдобавок у меня есть контроллер, который определяет операцию (в пакете de.kembytes.foo.webservice.controller):

@Path("/foo")
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Tag(name = "Foo")
public class FooController {
    @POST
    @Path("/calculate")
    @Operation(summary = "returns bar",
        responses = {
            @ApiResponse(responseCode = "200", description = "bar", content = {
                @Content(mediaType = MediaType.APPLICATION_XML, schema = @Schema(implementation = Bar.class)),
                @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = Bar.class)) }) })
    public Bar calculate(@RequestBody(required = true, content = @Content(schema = @Schema(implementation = FooInput.class))) FooInput input) throws Exception  {
        Bar bar = new Bar();
        bar.setValue1(...);
        bar.setValue2(...);
        bar.setValue3(...);

        return bar;
    }
}

Когда я запускаю свое приложение и получаю OpenApi-Documentation, FooController не включается. Это выглядит так:

{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "Foo-Webservice",
    "version" : "1.0.0"
  }
}

Почему конфигурация не была загружена в FooController, хотя она находится в указанном пакете ресурсов?

1 Ответ

0 голосов
/ 08 мая 2020

Я решил эту проблему, просканировав свой пакет на все классы с аннотацией @Path с помощью библиотеки Reflections . Затем я установил их все как resourceClasses.

Теперь метод инициализации выглядит так:

@Override
public void init(ServletConfig config) throws ServletException {
    OpenAPI oas = new OpenAPI();
    Info info = new Info()
        .title("Foo-Webservice")
        .version("1.0.0");

    oas.info(info);

    Set<String> resourceClasses = new Reflections(getClass().getPackageName())
        .getTypesAnnotatedWith(Path.class)
        .stream().map(c -> c.getName())
        .collect(Collectors.toSet());

    SwaggerConfiguration oasConfig = new SwaggerConfiguration()
        .prettyPrint(true)
        .openAPI(oas)
        .resourceClasses(resourceClasses);

    try {
        new JaxrsOpenApiContextBuilder()
            .servletConfig(config)
            .openApiConfiguration(oasConfig)
            .buildContext(true);
    } catch (OpenApiConfigurationException e) {
        throw new ServletException(e.getMessage(), e);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...