问题描述
我在 Jersey 2.34 Web 服务中使用 Swagger 2.x/OpenAPI 3.0 (io.swagger.v3.oas.*) 记录 API。 我已经扩展了 io.swagger.v3.core.filter.SpecFilter 来实现自定义的操作过滤(方法)以显示在 API 文档中。
/proxy/<url>
现在,我无法让这个过滤器工作。在我的 web.xml 中添加过滤器表达式时,
import io.swagger.v3.core.filter.OpenAPISpecFilter;
import io.swagger.v3.core.filter.SpecFilter;
import io.swagger.v3.oas.models.Operation;
public class ApiAuthorizationFilterImpl extends SpecFilter {
@Override
protected Operation filterOperation(OpenAPISpecFilter filter,Operation operation,String resourcePath,String key,Map<String,List<String>> params,String> cookies,List<String>> headers) {
System.out.println("Filtering operations: "+operation.getSummary());
}
服务未启动但失败
<filter>
<filter-name>ApiAuthorizationFilter</filter-name>
<filter-class>my.package.ApiAuthorizationFilterImpl</filter-class>
</filter>
<filter-mapping>
<filter-name>ApiAuthorizationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
将过滤器添加到 jersey.config.server.provider.classnames 时,就像其他过滤器一样,它似乎没有被选中。
06-Jul-2021 13:01:36.592 SEVERE [http-nio-8080-exec-27] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [ApiAuthorizationFilter]
java.lang.classCastException: class my.package.ApiAuthorizationFilterImpl cannot be cast to class javax.servlet.Filter (my.package.ApiAuthorizationFilterImpl is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @395fdbf6; javax.servlet.Filter is in unnamed module of loader java.net.urlclassloader @1ab3a8c8)
我真的无法找到要走的路,即使有不同方法的样本。 执行此过滤器的正确方法或实现此过滤的另一种方法是什么?
解决方法
既然我现在可以解决这个问题,我会把它贴在这里作为答案。
我通过深入了解 Swagger/OpenAPI 源代码意识到,这个过滤器应该写成
import io.swagger.v3.core.filter.AbstractSpecFilter;
import io.swagger.v3.core.model.ApiDescription;
import io.swagger.v3.oas.models.Operation;
public class ApiAuthorizationFilterImpl extends AbstractSpecFilter {
@Override
public Optional<Operation> filterOperation(Operation operation,ApiDescription api,Map<String,List<String>> params,String> cookies,List<String>> headers) {
}
}
然后将其作为过滤器类添加到 openapi.yaml 文档中来执行
prettyPrint: true
cacheTTL: 0
readAllResources: false
filterClass: my.package.ApiAuthorizationFilterImpl
openAPI:
info:
...