Search code examples
javaspring-bootspringdoc

How to get SpringDoc generated OpenAPI within the service


In a Spring Boot Web MVC REST service I want to use the operation ID and path values from SpringDoc generated OpenAPI from within the service where its generated. How can I get the OpenAPI JSON doc without going through the web endpoint?


Solution

  • If I understand you correctly:
    You want to get OpenAPI documentation in JSON format inside code your Spring application.

    I do it this way:
    1.) Create a component that extends from the OpenApiResource class.
    And create a getOpenApiJson method that calls getOpenApi() (creating or receiving an OpenApi model) and writeJsonValue() (serialization of OpenAPI).

    @Component
    public class CustomOpenApiResource extends OpenApiResource {
    
    
        public CustomOpenApiResource(ObjectFactory<OpenAPIService> openAPIBuilderObjectFactory,
                                     AbstractRequestService requestBuilder,
                                     GenericResponseService responseBuilder,
                                     OperationService operationParser,
                                     Optional<List<OperationCustomizer>> operationCustomizers,
                                     Optional<List<OpenApiCustomiser>> openApiCustomisers,
                                     Optional<List<OpenApiMethodFilter>> methodFilters,
                                     SpringDocConfigProperties springDocConfigProperties,
                                     SpringDocProviders springDocProviders) {
            super(openAPIBuilderObjectFactory,
                    requestBuilder,
                    responseBuilder,
                    operationParser,
                    operationCustomizers,
                    openApiCustomisers,
                    methodFilters,
                    springDocConfigProperties,
                    springDocProviders);
        }
    
    
        @Override
        protected String getServerUrl(HttpServletRequest request, String apiDocsUrl) {
            /**
             * How to implement this method you can find out for example from OpenApiWebMvcResource
             */
            return "";
        }
    
        public String getOpenApiJson() throws JsonProcessingException {
            return writeJsonValue(getOpenApi(Locale.getDefault()));
        }
    }
    

    2.) Inject CustomOpenApiResource component

        @Autowired
        private CustomOpenApiResource resource;
    

    And use getOpenApiJson()

        String openApiJson = resource.getOpenApiJson();