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

时间:2014-12-10 10:08:38

标签: rest jax-rs swagger

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

配置与样本(Swagger JAX RS sample)相同。

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

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

以某种方式可以避免Swagger的过滤器吗?

1 个答案:

答案 0 :(得分: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过滤器。