无法从swagger UI中的控制器获取我的端点列表

时间:2019-06-07 08:53:19

标签: java rest spring-boot swagger-ui swagger-2.0

我是使用Swagger UI进行Spring引导的新手。我只是想配置我的Rest控制器端点,使其显示在大张旗鼓的UI屏幕上,但未显示针对已定义规格的任何操作。可以肯定,这是一个配置问题。

我尝试了@EnableAutoConfiguration,但仍然找不到控制器

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!";
    }

}

预期:其余端点 实际:规范中未定义任何操作

4 个答案:

答案 0 :(得分:2)

我遇到了和你完全一样的问题,这是由于我的 @SpringBootApplication 类的错误放置引起的,就像你遇到的一样。

(在代码片段中,我有意省略了不太相关的注释,它们仍然必须在那里,因为您在帖子中有它们。

我还引用了“under”、“root package”等词,因为从技术上讲,Java 无法识别“子包”之类的东西。 Java 中的所有包都处于同一“级别”,即使网络域的点和相似之处“误导”我们以分层方式考虑它们。然而,Spring 广泛适用于“子包”和“根包”。)

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 {
    ....
}

我观察到如果 @SpringBootApplication 类不在 @RestController 类的“根包”中,它会破坏自动行为和 apis(...) 调用中设置的包名被忽略并且不扫描包。老实说,我不太确定apis() 应该如何工作以及它是错误还是功能

要在不添加 @ComponentScan 的情况下修复它,您的包组织应该是这样的:

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 {
    ...
}

您也可以通过指定进一步过滤API扫描

.apis(
    withClassAnnotation(RestController.class)
    .and(basePackage("com.example.myapplication.controller))
)

答案 1 :(得分:0)

您可以通过这种方式尝试。
您指定的路径可能有问题。

DATE:

答案 2 :(得分:0)

SwaggerConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer{

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }   

   @Bean
   public Docket apiDocket() {

       Docket docket =  new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example"))
                .paths(PathSelectors.any())
                .build();

       return docket;

    } 
}

SwaggerDemoApplication.java

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

pom.xml

<dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-core</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>   

如果您使用的是Spring Security,则必须在“配置”下方添加

 @Override
    public void configure(WebSecurity web) throws Exception {
        web
          .ignoring()  
            .antMatchers("/v2/api-docs", "/configuration/**", "/swagger*/**", "/webjars/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception{

         http
         .csrf().disable()
         .authorizeRequests()
         .antMatchers("/v2/api-docs", "/configuration/**", "/swagger*/**", "/webjars/**")
         .permitAll()
         .anyRequest().authenticated();
    }

答案 3 :(得分:0)

我已经检查了您的项目并发现了问题。

问题不是您的Swagger配置,但您的控制器未作为spring资源类进行扫描。

因为您的应用程序启动类(主类)没有组件扫描注释。
因此,您的课程应该是这样的:

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

现在您可以从http://localhost:8098/swagger-ui.html#这里访问API文档