【问题标题】:Swagger UI does not list any of the controller/end points though I am able to see the json under v2/api-docs endpointSwagger UI 没有列出任何控制器/端点,尽管我能够在 v2/api-docs 端点下看到 json
【发布时间】:2017-01-06 23:59:29
【问题描述】:

我无法让我的 Swagger UI 用于我的项目。 Swagger UI 很好,但它没有列出我的任何 REST 控制器。

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

当 Tomcat 7.0.54 出现时,它能够获取 swagger 端点。 我能够点击获取 json 消息的端点 v2/api-docs。 我也可以使用 swagger-ui,但我没有看到列出的任何控制器。 下拉列表为空,如下所示

**我目前面临的问题是

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

Swagger 的 Maven 依赖项
io.springfox springfox-swagger2 2.5.0
io.springfox springfox-swagger-ui 2.5.0

下面是我的 SwaggerCongifuration

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

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

【问题讨论】:

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


    【解决方案1】:

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

    我遇到了很多问题,但与 OP 的情况相匹配的主要问题是,虽然 /v2/api-docs 可访问并返回 JSON,但我的控制器显然没有被拾取,并且当我在 @987654325 访问 Swagger UI 时@,当该页面尝试请求 /swagger-resources/configuration/ui 时,我得到了 404

    我的 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/**

    【讨论】:

      【解决方案2】:

      您需要在 Swagger UI 中指向生成的 Swagger 定义。即代替http://example.com/api,给你的招摇定义路径类似于http://localhost:8080/RestResource/api/swagger.json

      This article might help you more

      【讨论】:

        猜你喜欢
        • 2019-10-05
        • 1970-01-01
        • 2018-03-04
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多