Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

Bloque de código
languagexml
<properties>
...
<springdoc.version>1.5.12</springdoc.version>
...
</properties

<!-- API DOC -->
<dependency>
	<groupId>org.springdoc</groupId>
	<artifactId>springdoc-openapi-webmvc-core</artifactId>
	<version>${springdoc.version}</version>
</dependency>

<dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-hateoas</artifactId>
      <version>${springdoc.version}</version>
</dependency>



<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-data-rest</artifactId>
    <version>${springdoc.version}</version>
</dependency><dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-security</artifactId>
    <version>${springdoc.version}</version>
</dependency>

...

Deben estar declaradas previamente siguiendo la página de confluence: Migración del backend a soporte oAuth.

3. Documentar

...

servicios

Para documentar correctamente nuestros servicios, OpenAPI ofrece /Swagger ofrecen varias anotaciones, tanto a nivel de clase como de método:

...

  • title => Título que se mostrará en la documentación. Si tenemos varias clases según los recursos (como debería ser), mencionar en este title el recurso con el que se trabaja en la clase.
                 P.Ej.: "Consulta de Expediente Académico", "Consulta de Datos de Afiliación", "Solicitudes de Matrícula".
  • description => Descripción larga genérica de los endpoints expuestos en la clase.

  • version => Versión de la documentación. Dejar exactamente el valor del código (version = "${server.image:1.0}"). 

    Info

    Solo debe haber un OpenApiDefinition por aplicación.

    Si nuestra aplicación cuenta con varios RestControllers (por que expone varios recursos), hay que poner la anotación @OpenApiDefinition en la clase Application principal de nuestro proyecto (la que está anotada con @SpringBootApplication).


      3.2 Anotaciones de método

...

Bloque de código
languagejava
 @Operation(summary = "TITULO DEL ENDPOINT", 
            description = "DESCRIPCION DEL ENDPOINT.",
            tags = {""}, //TAG PARA AGRUPAR EN LA DOCUMENTACIÓN
            security = {@SecurityRequirement( name = "OIDC", scopes = "openid" )}, //SOLO SI EL SERVICIO ES PRIVADO 
            responses = { 
                 @ApiResponse(responseCode = "500", description="", content = @Content), 
                 @ApiResponse(responseCode = "200", 
                            description="DESCRIPCION DE LA RESPUESTA SEGÚN EL CÓDIGO DEVUELTO",
                            content= @Content(schema=@Schema(implementation=ClaseDTODevuelto.class))) 
                .... 
            })

...

  • summary => Título, resumen descriptivo del endpoint.
  • description => Descripción larga del endpoint.
  • tags => Listado de tags para agrupar endpoints en la documentación. Se recomienda usar solo, de momento, "Publicpuede agrupar por "Private" o "Private" según el ámbito de nuestro endpointPublic", por recurso, por versiones...al gusto del desarrollador pero manteniendo el mismo criterio en la aplicación.
  • security => Añadir si el servicio es privado.
  • responses => Listado de códigos de respuesta devueltos por el endpoint, agrupados en notaciones ApiResponse
                         Rellenar, según el caso:
        • responseCode => código de respuesta http
        • description => descripción de la casuística cuando se devuelve el código de respuesta
        • content => clase devuelta cuando sucede la respuesta, por ejemplo, un DTO devuelto. (No incluir en caso de error o desconocimiento, es opcional).

Se recomienda que los servicios controlen y devuelvan un conjunto de respuestas completos, según las posibles casuísticas de éxito y error. Ver => Manejo de Errores en FundeWebJS.

Advertencia

¡¡ Documentar solo los casos programados !! 


F.A.Q.s

  • Mi servicio devuelve un ResponseEntity<miDTO>, ¿qué pongo en content?.


Aunque se devuelva un ResponseEntity<T>, hay que establecer el content con nuestro DTO, nunca con ResponseEntity.class.



  • Y si mi servicio devuelven una lista de DTOS con ResponseEntity<List<miDTO>>, ¿cómo lo documento?.

Si nuestro servicio devuelve una lista, hay que establecer la notación content de la siguiente forma:

Bloque de código
@ApiResponse(	responseCode = "200",
				description = "Listado de mis recursos genéricos",
				content = {
						@Content(	mediaType = "application/json",
						array = @ArraySchema( schema = @Schema( implementation = MiRecursoDTO.class ) ) )
} )@GetMapping( value = PRIVATE_PREFIX + "/v1/misrecursos/", produces = "application/json" )
public ResponseEntity<List<MiRecursoDTO>> getMisRecursos(


  • Para documentar respuestas de error con códigos de error (40X, 50X...), ¿qué content pongo?

Cuando se documentan los códigos de error devueltos por nuestro servicio, si no estamos devolviendo un objeto creado por nosotros, no es necesario establecer el content para los códigos de error.

Dejar el content vacío, y que no se documente el tipo devuelto, se puede realizar de dos formas:

Bloque de código
@ApiResponse(	responseCode = "401", description = "Acceso no autorizado",
				content = @Content( schema = @Schema( hidden = true ) ) ),   // FORMA 1
@ApiResponse(	responseCode = "404", description = "Recurso no encontrado",
				content = @Content )                                         // FORMA 2


  • Tengo varias clases con servicios, agrupados por recursos, pero solo me sale la cabecera con el título y la descripción de una de las clases.

Solo debe haber un OpenApiDefinition por aplicación. 

Se puede establecer como anotación del RestController si solo se tiene una clase, pero si tenemos varias clases, la notación OpenApiDefinition debe establecerse en la clase Application de nuestro proyecto (la que está anotada con @SpringBootApplication).
El título y la descripción deben ser relativos a la aplicación completa.


  • En los métodos privados, me documenta el JWT o la cabecera Authorization y no puedo probar el endpoint desde la documentación.

Cuando se establece un parámetro para securizar nuestro servicio, ya sea un AuthenticationPrincipal o una cabecera, es necesario ponerle la anotación Parameter( hidden= true) para que este parámetro no se documente.
Ejemplo:

Bloque de código
@GetMapping( PRIVATE_PREFIX + "/v1/misrecursos" )
public ResponseEntity<List<miRecursoDTO>> getMisRecursos(
		 	@Parameter( hidden = true ) @RequestHeader( value = AUTHORIZATION_HEADER, required = true ) String cabecera,
			@Parameter( hidden = true ) @AuthenticationPrincipal Jwt jwt )


Info

Si se ha incluido la dependencia <artifactId>springdoc-openapi-security</artifactId> en nuestro pom.xml, no es necesario poner a hidden el parámetro AuthenticationPrincipal.


  • A parte de ocultar parámetros, ¿se pueden ocultar servicios por que no interesa documentar?

Sí, además de la FAQ anterior para ocultar parámetros, se pueden ocultar servicios (y clases RestController completas) poniendo la anotación @Hidden (io.swagger.v3.oas.annotations.Hidden).


  • Documentar DTOs




Referencias



Artículos Relacionados

Contenido por etiqueta
showLabelsfalse
max5
spacesMDUYADA
showSpacefalse
sortmodified
reversetrue
typepage
cqllabel = "kb-how-to-article" and type = "page" and space = "MDUYADA"
labelskb-how-to-article

...