65

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

Picture:

enter image description here

9 Answers 9

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" ) )
        ...
3
  • 2
    for anyone who isn't familiar with what to fill in for "your package", it's the folder name right underneath java
    – notacorn
    Commented Jun 17, 2020 at 17:34
  • 2
    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. Commented Sep 8, 2020 at 15:31
  • Why was even the basic error controller added? Is it because when there is no controller to show something in swagger? Commented Nov 15, 2021 at 14:02
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.

1
  • 1
    This is the most elegant solution IMO. Commented Jan 8, 2022 at 22:55
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();
     }
    
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

5

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

@ApiIgnore
public class ErrorController {

This would exclude that class from documentation.

1
  • 5
    BasicErrorController is library functions, so cannot be easily annotated with @ApiIgnore
    – bladekp
    Commented Jan 8, 2019 at 21:08
2

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

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);
}
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
  }
}
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

3
  • It will work fine even if they are in different packages. These is no such constraint like the one you have posted. Commented Feb 15, 2019 at 5:45
  • If your configuration bean files are in different packages, then you have to use @componentScan("base-package") annotation on your main method.
    – ASK
    Commented Feb 15, 2019 at 6:58
  • We also can use "import" annotation so that SwaggerConfig class can be imported in the main class.
    – ASK
    Commented Apr 4, 2019 at 3:39

Not the answer you're looking for? Browse other questions tagged or ask your own question.