Found the solution. In web.xml I added the filter which handles the /api/api-docs/* request.
It is set before filters which handle /api/* requests.
<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 looks like this:
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() {}
}
This overrides all javax.servlet.Filter
implementations.
For overriding JAX RS filters, it is required to provide own implementation of javax.ws.rs.container.DynamicFeature
interface. This implementation applies filters only when requests to specific resources occurrs, in my case for resources in a specific package.
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.
...
}
}
}
In this case, Swagger UI works fine.
On requests to specific resources, JAX RS filters are applied.