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.

Reemplaza @PathVariable object por solo ID en Springdoc.

Actualmente estoy tratando de migrar de Springfox a Springdoc.

La mayoría de mis endpoints contienen una @PathVariable Instance. Obviamente, solo estoy pasando el ID de la instancia y Spring automáticamente resolvería el objeto por mí.

Aquí tienes un ejemplo:

@RestController
@RequestMapping(value = "/api/{instance}/role")
public class RoleController {

  @GetMapping()
  public ResponseEntity<?> getRoles(@PathVariable Instance instance) {
    return ResponseEntity.ok().build();
  }

}

Llamado como /api/myInstance/role.

Springfox lo manejaría correctamente, generando solo {instance} como una cadena que se mapea al ID de Instance. Sin embargo, Springdoc espera que se pase el objeto completo como un parámetro de ruta.

Hasta ahora intenté lo siguiente, sin embargo, no pareció tener ningún efecto:

static {
  SpringDocUtils.getConfig().replaceParameterObjectWithClass(Instance.class, String.class);
}

Si es posible, me gustaría evitar anotar cientos de endpoints con la misma anotación y resolver esto a nivel global.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Java, Spring, OpenAPI, Springfox y Springdoc, te sugeriría la siguiente solución:

    En Springdoc, puedes utilizar la anotación @io.swagger.v3.oas.annotations.Parameter para sobrescribir la configuración de parámetros predeterminada para un parámetro específico. Con esta anotación, puedes definir el tipo y formato del parámetro, así como otras propiedades.

    En tu caso, puedes agregar la anotación @Parameter a tu parámetro @PathVariable de Instance y especificar las propiedades name e in para que coincidan con la documentación de tu API. Aquí tienes un ejemplo:

    @GetMapping()
    public ResponseEntity<?> getRoles(
      @Parameter(name = "instance", in = ParameterIn.PATH, description = "ID de instancia") @PathVariable Instance instance
    ) {
      return ResponseEntity.ok().build();
    }
    

    Al definir explícitamente las propiedades name e in de la anotación @Parameter, Springdoc generará la documentación correcta de OpenAPI y el tipo de parámetro esperado en tu endpoint.

    Este método es más específico y evita la necesidad de anotar cada endpoint con la misma anotación, logrando así el efecto deseado a nivel global.

Comments are closed.