【问题标题】:Swagger API documentation could not be read due to filters由于过滤器,无法读取 Swagger API 文档
【发布时间】:2014-12-10 10:08:38
【问题描述】:

我有 JAXRS 应用程序,我想通过 Swagger 公开 REST API。

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

在我添加了我的应用程序所需的几个过滤器(javax.servlet.Filter 和 javax.ws.rs.container.ContainerRequestFilter)之前,它一直运行良好。

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

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

【问题讨论】:

  • 我相信 [this][1] StackOverflow 问题回答了您的问题。 [1]:stackoverflow.com/questions/3125296/…
  • 解决了 javax.servlet.Filter 问题,但是如何跳过 javax.ws.rs.container.ContainerRequestFilter 过滤器?
  • 已经有 URI。我想在读取 /api/api-docs 路径时跳过所有过滤器,而不修改每个过滤器并检查 URI。
  • 我不认为有一个集中的解决方案。我相信它是特定于过滤器的。

标签: rest jax-rs swagger


【解决方案1】:

找到了解决方案。在 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 过滤器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2014-02-22
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多