Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot get my endpoints list from controller in swagger UI

I am new to Spring boot with Swagger UI. I'm just trying to configure my Rest controller endpoints to show on swagger UI screen but it shows No operations for specs defined. Pretty sure, its a configuration issue.

I have tried @EnableAutoConfiguration, still it can't find the controller

SwaggerDemoApplication.java

package com.example.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SwaggerDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SwaggerDemoApplication.class, args);
 }

}

SwaggerConfig.java

package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import static springfox.documentation.builders.PathSelectors.regex;

@EnableSwagger2
@Configuration

public class SwaggerConfig {

 @Bean
 public Docket productApi() {
     return new Docket(DocumentationType.SWAGGER_2)  
              .select()                                  
              .apis(RequestHandlerSelectors.basePackage("com.example.controller"))              
              .paths(regex("/test.*"))                       
              .build();                                           

 } 
}



TestController.java

package com.example.controller;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.Api;

@RestController
@RequestMapping(value = "/test")
@Api(value="onlinestore", description="Operations pertaining to products in Online Store")
public class TestController {

    @RequestMapping(value = "/test-swagger", method= RequestMethod.GET)
    public String home() {
        return "Spring is here!";
    }

}

Expected: Rest endpoint Actual: No operations defined in spec

like image 930
Anirban Dutta Avatar asked Sep 05 '25 02:09

Anirban Dutta


1 Answers

I had exactly the same problem like you and it was caused with the wrong placement of my @SpringBootApplication class, just like you have it.

(In the code snippets, I am intentionally omitting less relevant annotations, they still must be there as you have them in your post.

I also quote the words like "under", "root package" etc., as technically Java does not recognize anything like a "sub-package". All the packages in Java are at the same "level", even if the dots and the resemblance of the web domains "mislead" us to think about them hierarchically. However Spring extensively works with "sub-packages" and "root-packages".)

package com.example.config;
@SpringBootApplication
public class SwaggerDemoApplication {
    ...
}

package com.example.config;
@EnableSwagger2
public class SwaggerConfig {
      ...
      .apis(RequestHandlerSelectors.basePackage("com.example.controller"))              
      ...
}

@RestController
package com.example.controller; // notice that this is not "under" com.example.config where SwaggerDemoApplication resides
public class TestController {
    ....
}

I observed that if the @SpringBootApplication class is not in the "root package" of the @RestController class, it breaks the automagical behaviour and the package name set in the call of apis(...) is ignored and the package is not scanned. To be honest, I am not very much sure how the apis() is supposed to work and whether it is a bug or a feature.

To fix it without adding @ComponentScan, your package organisation should be something like this:

package com.example.myapplication; // the main class is placed in the "root" package
@SpringBootApplication
public class SwaggerDemoApplication {
    ...
}

package com.example.myapplication.config;
@EnableSwagger2
public class SwaggerConfig {
      ...
      .apis(RequestHandlerSelectors.basePackage("com.example.myapplication"))
      ...
}

package com.example.myapplication.controller;
@RestController
public class TestController {
    ...
}

You may also further filter the API scanning by specifying

.apis(
    withClassAnnotation(RestController.class)
    .and(basePackage("com.example.myapplication.controller))
)
like image 57
Honza Zidek Avatar answered Sep 10 '25 03:09

Honza Zidek