有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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。有没有人看到上面任何看起来不正确的东西,或者有人有什么想法


共 (2) 个答案

  1. # 1 楼答案

    我刚刚成功地使用了过滤器。我很难让过滤器正常工作。问题是找到我的过滤器的实现类时出现了问题。当我把软件包换成斯威格的类可以访问的地方时,一切都正常进行。接下来,我必须在过滤器类上实现我的逻辑。我的filter类也实现了接口SwaggerSpecFilter。致以最良好的祝愿

    我使用的是DefaultJaxrsConfig:

    <servlet>
      <servlet-name>Jersey2Config</servlet-name>
        <servlet-class>io.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class>
        <init-param>
            <param-name>api.version</param-name>
            <param-value>1.0.0</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.api.basepath</param-name>
            <param-value>/my-service/service/</param-value>
        </init-param>
        <init-param>
            <param-name>swagger.filter</param-name>
            <param-value>mypackage.SwaggerFilter</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>
    
  2. # 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>

    再说一次,我不确定这是否有效,但我只是一时兴起