Ocultar endpoints Spring Swagger 2

Es posible que en alguna ocasión no queramos que Swagger genere la documentación de algún endpoint por algún motivo concreto. Estos son los pasos a seguir:

1. Definir una anotación con la que decoraremos todos los métodos de los controladores que se quieran ocultar.

import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface HideApiDocumentation {

}

2. Modificar la configuración de Swagger2 para que ignore los métodos anotados.

import static springfox.documentation.builders.PathSelectors.*;
import static com.google.common.base.Predicates.*;
import static springfox.documentation.builders.RequestHandlerSelectors.withMethodAnnotation;

...
...

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

	@Bean
	public Docket api() {
		return new Docket(DocumentationType.SWAGGER_2)
			.select()
			.apis(not(withMethodAnnotation(HideApiDocumentation.class)))
			.paths(PathSelectors.any())
			.build();
	}
}

3. Utilizar la anotación en los métodos de los controladores

@RestController
public class SomeController {

	@HideApiDocumentation
	@PostMapping("/")
	public String post(@RequestBody String param) {
		...
	}

}

4. Opcional. Ocultar endpoints de librerías de terceros.

Si queremos ocultar también los enpoints generados por librerías de terceros (p.ej oauth), tendremos que indicar manualmente las rutas (método “paths”).

@Bean
public Docket api() {
	return new Docket(DocumentationType.SWAGGER_2)
		.select()
		.apis(not(withMethodAnnotation(HideApiDocumentation.class)))
		.paths(paths())
		.build();
}

private Predicate<String> paths() {
	return not(or(
	regex("/oauth/token.*"),
	regex("/oauth/revoke.*")));
}

Espero que sea de utilidad.

Deja un comentario