首页 文章

由于过滤器,无法读取Swagger API文档

提问于
浏览
0

我正在使用JAXRS应用程序,我希望通过Swagger公开REST API .

配置与示例(Swagger JAX RS sample)相同 .

它已经工作正常,直到我添加了我的应用程序所需的几个过滤器(javax.servlet.Filter和javax.ws.rs.container.ContainerRequestFilter) .

过滤器在/ api / * path上工作,Swagger从/ api / api-docs路径读取文档 .

是否有可能避免Swagger的过滤器?

1 回答

  • 0

    找到了解决方案 . 在web.xml中,我添加了处理/ api / api-docs / *请求的过滤器 . 它在处理/ api / *请求的过滤器之前设置 .

    <filter>
        <filter-name>SwaggerDocRequestFilter</filter-name>
        <filter-class>my.package.filters.SwaggerDocRequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SwaggerDocRequestFilter</filter-name>
        <url-pattern>/api/api-docs/*</url-pattern>     
        <dispatcher>REQUEST</dispatcher>   
    </filter-mapping>
    

    SwaggerDocRequestFilter看起来像这样:

    public class SwaggerDocRequestFilter implements Filter {
    
        @Override
        public void init(FilterConfig fc) throws ServletException {        
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            String path = ((HttpServletRequest) request).getRequestURI();
            if (path.contains("/api-docs")) {
                String forwardPath = ((HttpServletRequest) request).getServletPath() + 
                        StringUtils.defaultString(((HttpServletRequest)request).getPathInfo());
    
                request.getRequestDispatcher(forwardPath).
                        forward(request, response); 
            } else {
                chain.doFilter(request, response);
            }
        }
    
        @Override
        public void destroy() {} 
    }
    

    这将覆盖所有 javax.servlet.Filter 实现 .

    对于重写JAX RS过滤器,需要提供 javax.ws.rs.container.DynamicFeature 接口的自己实现 . 此实现仅在针对特定资源的请求发生时应用过滤器,在我的情况下针对特定包中的资源 .

    public class MyDynamicFiltersRegister implements DynamicFeature {
    
    @Override
    public void configure(final ResourceInfo resourceInfo, final FeatureContext context) {
            if (resourceInfo.getResourceClass().getPackage().getName().equals("my.package.resources))   {
                 //register filters on FeatureContext objec only if resource in specific package.
                 ...
            }
        }
    }
    

    在这种情况下,Swagger UI工作正常 . 在对特定资源的请求中,应用JAX RS过滤器 .

相关问题