java - 无法从 swagger UI 中的 Controller 获取我的端点列表

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

我是 Spring boot 和 Swagger UI 的新手。我只是想配置我的 Rest Controller 端点以显示在 swagger UI 屏幕上,但它显示没有定义规范的操作。很确定,这是一个配置问题。

我已经尝试过@EnableAutoConfiguration,仍然找不到 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!";
    }

}

预期:休息端点 实际:规范中没有定义任何操作

最佳答案

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

(在代码片段中,我故意省略了不太相关的注释,它们仍然必须存在,就像您在帖子中那样。

我还引用了“under”、“root package”等词语,因为从技术上讲,Java 无法识别“子包”之类的东西。 Java 中的所有包都处于同一“级别”,即使 Web 域的点和相似性“误导”我们按层次结构思考它们。然而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))
)

关于java - 无法从 swagger UI 中的 Controller 获取我的端点列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56491056/

相关文章:

java - 如何使用 gradle 对多个嵌入式服务器运行 spring-boot 集成测试

java - 在同一个 Selenium 网格节点上运行 PhantomJS 和 Chrome 浏览器

java - XSS 检查 Angular js - 基于 REST 的 Web 应用程序

java - 一起使用 Spring Boot、QueryDSL 和 Springfox Swagger - Guava 版本不匹配

spring - Spring Websocket 中的 Direct、Group、Channel 需要多少个端点和主题?

asp.net-mvc - 具有复杂操作(动词)的 RESTful Web 服务

java - Servlet 3.0 的构造函数依赖注入(inject)?

java - LWJGL 中未绘制线条

java - Android 上的 Snackbar 无需更改主题

.net - WCF和可选参数