Remove Basic Error Controller In SpringFox SwaggerUI
Asked Answered
C

9

65

Is there a way i can remove the "basic-error-controller" from springfox swagger-ui?

Picture:

enter image description here

Ce answered 5/10, 2015 at 5:39 Comment(0)
F
106

You can restrict the request handler selector to scan only the package of your project:

    return new Docket( DocumentationType.SWAGGER_2)
        .select()
        .apis( RequestHandlerSelectors.basePackage( "your package" ) )
        ...
Fossette answered 15/11, 2015 at 14:34 Comment(3)
for anyone who isn't familiar with what to fill in for "your package", it's the folder name right underneath javaUnthinkable
That wasn't needed. Sometimes it's not clear what someone means when there's just text that doesn't look like the real value. Also, even though, they probably could have figured it out from reading the docs or the code, not everyone is as amazing as you.Tonatonal
Why was even the basic error controller added? Is it because when there is no controller to show something in swagger?Auckland
L
46

I think, the most elegant solution is to include only @RestController controllers into swagger, only thing to bear in mind, is to annotate all the REST controllers with that annotation:

new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
            .paths(PathSelectors.any())
            .build();

As BasicErrorController is annotated with @Controller only, swagger would avoid BasicErrorController in definition file. Of course you can use your custom annotation instead of @RestController to mark your REST controllers as controllers eligible by swagger.

Laure answered 7/1, 2019 at 21:41 Comment(1)
This is the most elegant solution IMO.Abigail
D
27
  • It can be done using Predicate.not() .

     @Bean
     public Docket api() {
         return new Docket(DocumentationType.SWAGGER_2)
             .select()
             .apis(RequestHandlerSelectors.any())
             .paths(PathSelectors.any())
             .paths(Predicate.not(PathSelectors.regex("/error.*")))
             .build();
     }
    
Doggy answered 5/3, 2018 at 5:52 Comment(0)
E
9

For example if your parent Package is com.app.microservice

package com.app.microservice;

Then use the following code it will only display the Controllers within the Package and disable/exclude others

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.app.microservice"))
                .build();
    }

enter image description here

Engrail answered 17/2, 2019 at 5:44 Comment(0)
Q
5

U can also use springfox-swagger2 annotations. springfox.documentation.annotations.ApiIgnore

@ApiIgnore
public class ErrorController {

This would exclude that class from documentation.

Quirt answered 21/11, 2016 at 10:41 Comment(1)
BasicErrorController is library functions, so cannot be easily annotated with @ApiIgnoreLaure
D
2

My problem was just that I forgot to annotate Docket api() method with @Bean.

Dicentra answered 1/2, 2020 at 2:19 Comment(0)
A
1

This can be done by moving @Bean definition to main class (the one with @SpringBootApplication) and use its this.getClass().getPackageName() in basePackage():

@Bean
public Docket swagger() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage(this.getClass().getPackageName()))
            .paths(PathSelectors.any())
            .build()
            .useDefaultResponseMessages(false);
}
Anzus answered 10/12, 2019 at 17:20 Comment(0)
O
1

With Swagger.v3, we can use @Hidden. So:

import io.swagger.v3.oas.annotations.Hidden;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyErrorController implements ErrorController {

  @RequestMapping("/error")
  @Hidden // Don't show in the Swagger doco
  @ResponseBody
  public void handleError(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // My handler code
  }
}
Oogenesis answered 7/2, 2023 at 0:44 Comment(0)
W
0

After trying a lot of solutions, nothing works for me. Finally I got to know the very basic thing i.e. make sure that the file in which you have defined your swagger configuration file and your main method file should be in the same package .

@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
    .select()
    .apis(RequestHandlerSelectors.any())
    .paths(PathSelectors.any())
    .paths(Predicates.not(PathSelectors.regex("/error.*")))
    .build();
}

Please check this image

Wey answered 15/2, 2019 at 3:56 Comment(3)
It will work fine even if they are in different packages. These is no such constraint like the one you have posted.Ce
If your configuration bean files are in different packages, then you have to use @componentScan("base-package") annotation on your main method.Wey
We also can use "import" annotation so that SwaggerConfig class can be imported in the main class.Wey

© 2022 - 2024 — McMap. All rights reserved.