rest - Swagger UI 没有列出任何 Controller /端点,尽管我能够在 v2/api-docs 端点下看到 json

标签 rest swagger swagger-ui spring-4 swagger-2.0

我无法让我的 Swagger UI 与我的项目一起工作。 Swagger UI 运行良好,但没有列出我的任何 REST Controller 。

我正在使用 SPRING 4.2.6.RELEASE 和 Swagger 2.5.0 。我的其余服务部署到 Tomcat 7.0.54 。

当 Tomcat 7.0.54 出现时,它能够获取 swagger 端点。
我能够访问获取 json 消息的端点 v2/api-docs。
我也可以点击 swagger-ui,但我没有看到列出任何 Controller 。
下拉菜单是空的,如下

enter image description here

**我目前面临的问题是

  • 我无法获取/swagger-resources/configuration/ui,当我启动 swagger UI 时,当 UI 尝试获取/swagger-resources/configuration/ui 时,我收到 404(未找到)错误。我已经为 swagger-resources 设置了资源处理程序,但这似乎没有帮助。你能告诉我可能缺少什么吗?
  • 我应该在扩展的 WAR 中看到 META-INF 下的资源文件夹吗? META-INF 中是否应该有任何与 springfox 相关的文件/文件夹?
    **

  • Swagger 的 Maven 依赖项


    io.springfox
    springfox-swagger2
    2.5.0


    io.springfox
    springfox- Swagger -ui
    2.5.0


    下面是我的 Swagger 配置
    @EnableSwagger2
    public class SwaggerConfiguration {
    
    @Bean
    public Docket api() {
        List<SecurityContext> security = new ArrayList<SecurityContext>();
        security.add(securityContext());
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
                .pathMapping("/").securityContexts(security);
    }
    
    private SecurityContext securityContext() {
        return SecurityContext.builder()
                .forPaths(PathSelectors.regex("/"))
                .build();
     }
    }
    

    下面是我的 WebConfig.xml
    @EnableWebMvc
    @Configuration
    @Import(SwaggerConfiguration.class)
    @ComponentScan("com.bank.direct.services")
    
    public class WebConfig extends WebMvcConfigurerAdapter {
    
    
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> pConverters) {
        pConverters.add(RestUtils.getJSONMessageConverter());
    }
    
    
    @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/");
    }
    
    }
    

    下面是 SecurityCongif.xml
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    
    @Autowired
    private AuthenticationService _authenticationService;
    
    
    @Autowired
    public void globalUserDetails(AuthenticationManagerBuilder pAuth) throws Exception {
    
        pAuth.userDetailsService(_authenticationService);
    }
    
    
    @Override
    protected void configure(HttpSecurity pHttp) throws Exception {
    
        // Enable HTTP caching
        pHttp.headers().cacheControl().disable();
    
        // Configure security
        pHttp.httpBasic()
    
        // -- Allow only authenticated request
        .and()
        .authorizeRequests()
        .anyRequest().authenticated()
    
        // -- Logout configuration
        .and()
        .logout()
        .logoutUrl("/rest/users/logout/")
        .deleteCookies("XSRF-TOKEN")
        .logoutSuccessUrl("/static/index.html")
        .invalidateHttpSession(true)
    
        // -- CSRF configuration
        .and()
        .csrf().csrfTokenRepository(csrfTokenRepository())
        .and()
        .addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class);
    
    }
    
    
    private Filter csrfHeaderFilter() {
    
        return new OncePerRequestFilter() {
    
            @Override
            protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    
                CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
                if (csrf != null) {
                    Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
                    String token = csrf.getToken();
                    if (cookie == null || token != null && !token.equals(cookie.getValue())) {
                        cookie = new Cookie("XSRF-TOKEN", token);
                        cookie.setPath("/");
                        response.addCookie(cookie);
                    }
                }
                filterChain.doFilter(request, response);
            }
        };
    }
    
    
    private CsrfTokenRepository csrfTokenRepository() {
        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
        repository.setHeaderName("X-XSRF-TOKEN");
        return repository;
    }
    

    休息 Controller 类如下
    @RestController
    @RequestMapping(value = "/vehicles", produces =     MediaType.APPLICATION_JSON_UTF8_VALUE)
    public class VehicleResource extends Resource {
    
    @Autowired
    private IVehicleService _vehicleService;
    
    @RequestMapping(value = "/brands", method = RequestMethod.GET)
    public APIResponseEntity getBrands(WebRequest pWebRequest) {
    
        IUser user = getUser(pWebRequest);
        BrandCriteria criteria = new BrandCriteria();
        criteria.setLanguageCode(user.getLanguageCode());
    
        List<Brand> res = _vehicleService.getBrands(user, criteria);
    
        return newResponseOK(res);
    }
    
    @RequestMapping(value = "/brands/{brand_code}", method = RequestMethod.GET)
    public APIResponseEntity getBrand(WebRequest pWebRequest, @PathVariable("brand_code") String pBrandCode) {
    
        IUser user = getUser(pWebRequest);
        BrandCriteria criteria = new BrandCriteria();
        criteria.setLanguageCode(user.getLanguageCode());
        criteria.setBrandCode(pBrandCode);
        List<Brand> res = _vehicleService.getBrands(user, criteria);
        return newResponseOK(res);
     }
    }   
    

    最佳答案

    在将旧项目从 XML Spring 配置迁移到 Java Spring 配置并更新 spring 和 Swagger 版本后,我遇到了一个听起来完全像这样的问题,所以我想我会在这里记录我的解决方案。

    我遇到了很多问题,但与 OP 场景相匹配的主要问题是 while /v2/api-docs可以访问并返回 JSON,我的 Controller 显然没有被拿起,当我在 /swagger-ui.html 访问 Swagger UI 时,当该页面尝试请求时,我收到了 404 /swagger-resources/configuration/ui
    我的 Swagger 配置类是:

    @Configuration
    @EnableSwagger2
    public class SwaggerWebConfig {
        @Bean
        public Docket api() {
            ...
        }
    }
    

    @EnableSwagger2 注释导入另一个配置类 Swagger2DocumentationConfiguration,后者又导入 SwaggerCommonConfiguration,后者对 springfox.documentation.swagger.web 中的类进行组件扫描最终加载 ApiResourceController,这是
  • /swagger-resources/
  • /swagger-resources/configuration/security
  • /swagger-resources/configuration/ui

  • 来自。

    我不正确的是我的 SwaggerWebConfig 类是由根应用程序上下文加载的,而它应该属于 Web 应用程序上下文 ( see ApplicationContext vs WebApplicationContext )。

    Web 应用程序上下文中的 Bean 可以访问根应用程序上下文中的 bean,但反过来不行,这就解释了为什么 Docket bean(在根应用程序上下文中错误地)无法获取 Web 应用程序上下文中的 @Controller bean 以及解释了为什么尽管创建了 ApiResourceController bean,但它的方法在尝试访问它们时会给出 404(它们应该在 Web 应用程序上下文中)

    相关问题的其他一些注意事项:
  • 如果您可以访问 v2/api-docs,那么您的 Docket bean 正在运行
  • 在非 spring-boot 环境中,您需要自己注册两个资源处理程序,因为 spring boot 的自动配置会为您完成此操作,如 this question 的答案中所述。 .这应该可以解决 404 的问题:
  • /swagger-ui.html(即 404 获取实际的 html swagger-ui.html 页面)
  • 以及 swagger-ui.html 加载的三个 webjar:
  • /webjars/springfox-swagger-ui/springfox.js
  • /webjars/springfox-swagger-ui/swagger-ui-bundle.js
  • /webjars/springfox-swagger-ui/swagger-ui-standalone-preset.js
  • 如果您收到拒绝访问而不是 404 未找到,则如 this answer 所示,您可能需要告诉 spring security 允许访问:
  • /webjars/**
  • /swagger-ui.html
  • /v2/api-docs
  • /swagger-resources/**
  • 关于rest - Swagger UI 没有列出任何 Controller /端点,尽管我能够在 v2/api-docs 端点下看到 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39231914/

    相关文章:

    api - 如果资源不可用于请求的操作,HTTP 状态代码应该是什么?

    swagger - 如何从 swagger 2.0 swagger-codegen-cli.jar 生成 java 代码

    php - 在Swagger openAPI注释中发出 'Authorization: Bearer <token>'

    java - Swagger-ui - 列表参数编码

    java - Swagger2 > 记录一个 SpringBoot MvcEndpoint

    c# - Swagger - 隐藏 api 版本参数

    javascript - Angular 和 Laravel 应该是单独的应用程序还是 Laravel 应该为 Angular 应用程序提供服务?

    c++ - 控制台应用程序和图形界面之间的交互类型

    android - 当连接是移动数据 xamarin 表单时无法在服务器上发出 Put 和 Post 请求

    java - 使用 swagger 从 .json 文件生成 java 中的 Rest api