es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Swagger – trabajando con archivos dinámicos y estáticos

Tengo una aplicación Spring Boot que utiliza una biblioteca y ambas utilizan Swagger para generar documentación. Actualmente, cuando accedo a la página principal de Swagger, veo un cuadro combinado con dos opciones, una para la aplicación principal y otra para la biblioteca. Hasta aquí todo bien. El problema es que decidimos servir la documentación de la aplicación principal en un archivo estático, pero la biblioteca debe permanecer como está actualmente, basada en anotaciones.

¿Alguien sabe cómo combinar un archivo estático y uno basado en anotaciones?

Si no es posible, puedo generar el archivo YAML de la biblioteca y servirlo también como estático, debería estar bien, pero en este caso, ¿cómo puedo servir ambos archivos y mostrarlos en un cuadro combinado para que los usuarios puedan elegir cuál desean visualizar?

Gracias de antemano por cualquier ayuda.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución para mezclar un archivo estático y documentación de Swagger basada en anotaciones

    Una solución para mezclar un archivo estático y documentación de Swagger basada en anotaciones es utilizar la anotación @Import en la clase de configuración de Spring Boot.

    Primero, crea una nueva clase de configuración de Swagger que extienda la clase SwaggerConfiguration y sobrescribe el método api().

    @Configuration
    @EnableSwagger2
    public class CustomSwaggerConfiguration extends SwaggerConfiguration {
    
      @Override
      public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
          .select()
          .build()
          .groupName("Library") // Cambia el nombre del grupo para distinguirlo de la aplicación principal
          .apiInfo(apiInfo());
      }
    
      // Sobrescribe otros métodos como apiInfo() si es necesario
    }
    

    Luego, en la clase de configuración de la aplicación principal, importa la configuración personalizada de Swagger y agrega un nuevo bean que sirva el archivo estático.

    @Configuration
    @Import(CustomSwaggerConfiguration.class)
    public class MainAppConfig {
    
      @Bean
      public WebMvcConfigurer swaggerFileConfigurer() {
        return new WebMvcConfigurer() {
          @Override
          public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/swagger/**")
                    .addResourceLocations("classpath:/static/swagger/");
          }
        };
      }
    }
    

    Finalmente, crea un nuevo archivo HTML que muestre ambos interfaces de usuario de Swagger en un combo box.

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Swagger UI Combo</title>
      <link rel="stylesheet" href="/swagger/ui/swagger-ui.css">
      <script src="/swagger/ui/swagger-ui-bundle.js"></script>
      <script src="/swagger/ui/swagger-ui-standalone-preset.js"></script>
    </head>
    <body>
      <h1>Swagger UI Combo</h1>
      <div id="swagger-ui"></div>
      <script>
        window.onload = function() {
          const ui = SwaggerUIBundle({
            urls: [
              {
                name: "Aplicación Principal",
                url: "/swagger/main-app.yaml"
              },
              {
                name: "Biblioteca",
                url: "/swagger/api-docs"
              }
            ],
            dom_id: '#swagger-ui',
            presets: [
              SwaggerUIBundle.presets.apis,
              SwaggerUIStandalonePreset
            ],
            layout: "BaseLayout"
          });
          window.ui = ui;
        }
      </script>
    </body>
    </html>
    

    En este ejemplo, la documentación de la aplicación principal se sirve como un archivo YAML estático (/swagger/main-app.yaml) y la documentación de la biblioteca se sirve como un Swagger basado en anotaciones (/swagger/api-docs). El combo box permite a los usuarios cambiar entre ambos interfaces de usuario de Swagger.

    ¡Espero que esta solución sea de ayuda!

Comments are closed.