java Swagger扩展SwaggerSpecFilter
我正试图编写自己的Swagger API过滤器,以隐藏API中出现的某些内容。我想我对自己应该做什么有一个很好的想法,但我肯定在细节上遗漏了什么
我使用的是Swagger Core 1.3.10和Spring 3.1。以下是我现在拥有的一些:
SwaggerAPiaAuthorizationFilter
public class SwaggerApiAuthorizationFilter implements SwaggerSpecFilter {
private final static Logger logger = LoggerFactory.getLogger(SwaggerApiAuthorizationFilter.class);
@Override
public boolean isOperationAllowed(Operation operation, ApiDescription api, Map<String, List<String>> params,
Map<String, String> cookies, Map<String, List<String>> headers) {
return true;
}
@Override
public boolean isParamAllowed(Parameter parameter, Operation operation, ApiDescription api, Map<String, List<String>> params,
Map<String, String> cookies, Map<String, List<String>> headers) {
// do not allow the documentation to be generated on parameters that have their access set to "internal"
if (parameter.paramAccess().isDefined() && parameter.paramAccess().get().equalsIgnoreCase("internal")) {
logger.debug("The following parameter has been hidden from the Swagger API documentation: " + parameter.name());
return false;
} else {
return true;
}
}
}
大摇大摆
public class SwaggerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private final static Logger logger = LoggerFactory.getLogger(SwaggerServlet.class);
BeanConfig beanConfig;
SwaggerApiAuthorizationFilter swaggerApiAuthorizationFilter;
public void setBeanConfig(BeanConfig beanConfig) {
this.beanConfig = beanConfig;
}
public void setSwaggerApiAuthorizationFilter(SwaggerApiAuthorizationFilter swaggerApiAuthorizationFilter) {
this.swaggerApiAuthorizationFilter = swaggerApiAuthorizationFilter;
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
try {
super.init(servletConfig);
beanConfig.setBasePath("/mbl/services");
beanConfig.setVersion("1.0");
beanConfig.setResourcePackage("com.whatever.resources");
beanConfig.setScan(true);
FilterFactory.setFilter(swaggerApiAuthorizationFilter);
logger.debug("The Swagger servlet has been initialized");
} catch (Exception e) {
e.printStackTrace();
}
}
}
弹簧配置文件
<!-- Swagger Configuration and Providers -->
<bean id="beanConfig" class="com.wordnik.swagger.jaxrs.config.BeanConfig">
<property name="title" value="Java API"/>
<property name="version" value="1.0" />
<property name="basePath" value="/mbl/services"/>
<property name="resourcePackage" value="com.whatever.resources"/>
<property name="scan" value="true"/>
</bean>
<bean id="swaggerApiAuthorizationFilter" class="com.whatever.util.SwaggerApiAuthorizationFilter" />
网络。xml
<!-- Enabling Swagger servlet -->
<servlet>
<servlet-name>Swagger Servlet</servlet-name>
<servlet-class>com.whatever.web.SwaggerServlet</servlet-class>
<init-param>
<param-name>swagger.filter</param-name>
<param-value>com.whatever.util.SwaggerApiAuthorizationFilter</param-value>
</init-param>
<load-on-startup>-1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Swagger Servlet</servlet-name>
<url-pattern>/api-docs</url-pattern>
</servlet-mapping>
资源类
public Response getUserInfo(
@Context HttpHeaders headers,
@ApiParam(name="brand", access="internal") @CookieParam(value = "brand") String brand) {
似乎我的SwiggerapiAuthorizationFilter甚至没有被调用。我的猜测是,在我的配置中,无论是在web上还是在web上,都出现了一些错误。xml或招摇过市的servlet。有没有人看到上面任何看起来不正确的东西,或者有人有什么想法
# 1 楼答案
我刚刚成功地使用了过滤器。我很难让过滤器正常工作。问题是找到我的过滤器的实现类时出现了问题。当我把软件包换成斯威格的类可以访问的地方时,一切都正常进行。接下来,我必须在过滤器类上实现我的逻辑。我的filter类也实现了接口SwaggerSpecFilter。致以最良好的祝愿
我使用的是DefaultJaxrsConfig:
# 2 楼答案
我只是猜测,但我认为您需要实现Filter以及SwaggerSpecFilter接口,而不是扩展HttpServlet(查看源代码,它看起来不像人们预期的那样SwaggerSpecFilter extends Filter),然后将其配置为web中的过滤器。xml而不是servlet。应该是这样的:
<filter> <filter-name>Swagger Filter</filter-name> <filter-class>com.whatever.util.SwaggerApiAuthorizationFilter</filter-class> </filter> <filter-mapping> <filter-name>Swagger Filter</filter-name> <url-pattern>/api-docs</url-pattern> </filter-mapping>
再说一次,我不确定这是否有效,但我只是一时兴起