2015-06-23 1 views
0

Я пытаюсь написать свой собственный фильтр API Swagger, чтобы скрыть определенные вещи от появления в API. Я думаю, что у меня неплохое представление о том, что делать должно быть, но я должен что-то пропускать в деталях.Swagger - Расширение SwaggerSpecFilter

Я использую Swagger Core 1.3.10 и Spring 3.1. Вот некоторые из того, что у меня сейчас:

SwaggerApiAuthorizationFilter

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; 
     } 
    } 

} 

SwaggerServlet

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" /> 

web.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) { 

Оказывается, что мой SwaggerApiAuthorizationFilter даже не называют. Я предполагаю, что что-то не так в моей конфигурации либо в web.xml, либо в SwaggerServlet. Кто-нибудь видит что-либо выше, что выглядит некорректно, или у кого-нибудь есть идеи?

ответ

0

Я просто догадываюсь, но я думаю, что вам нужно реализовать фильтр, а также интерфейс SwaggerSpecFilter вместо расширения HttpServlet (глядя на источник, который он не появляется. SwaggerSpecFilter расширяет фильтр, как и следовало ожидать), затем настройте его как фильтр в вашем web.xml вместо сервлета. Было бы что-то вроде этого:

<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>

Опять же, не уверен, если это будет работать, но только догадка с верхней части моей головы.

0

Я только что использовал фильтр. У меня были проблемы с правильной настройкой фильтра. Проблема заключалась в том, что возникла проблема с поиском класса реализации фильтра. Когда я сменил пакет на место, доступное классу swagger, все правильно функционировало. Затем мне просто пришлось реализовать свою логику в моем классе фильтров. Мой класс фильтра также реализовал интерфейс 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> 
Смежные вопросы