gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:18:11 25 4
gpt4 key购买 nike

我无法让我的 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com