2016-10-07 2 views
4

Я использую spring-data-rest-webmvc: jar: 2.5.3.RELEASE для записи REST API и отображения ресурсов в springfox-data- отдых-2.6.0. Разметка отображает все методы в RestEntityController. Я исключил некоторые методы на уровне репозитория, используя @RestResource(exported = false). Но swagger загружает все другие HTTP-методы, такие как OPTIONS, HEAD и PATCH, которые я не могу исключить из RepositoryRestResource.Как исключить метод OPTIONS, HEAD и PATCH из объекта spring-data-restController

Как сделать мой чванз чистым ресурсом, который включает только мои CRUD и методы поиска? Необходимо поддерживать это либо при использовании конфигурации Spring-data-rest, либо с использованием конфигурации springfox.

+0

Жесткий вопрос. Не могли бы вы дать мне подсказку, что такое ваш RestEntityController? – mika

ответ

4

После того, как я углубился в документацию springfox и отбросил некоторые идеи тупика, я придумал два решения, которые могут решить вашу проблему. Применяйте и смешивайте их в соответствии с вашими потребностями.

Подсказка # 1 - фильтр, используя RequestHandlerSelectors

Расскажите springfox какой оконечный метод вы хотели бы показать в развязности-интерфейсе. Поэтому вы можете настроить RequestHandlerSelector для сканирования всего приложения, определенного пакета или классов и методов, которые вы аннотировали с помощью общей аннотации.

//Example for the method scan based on springfox's @ApiOperation annotation 

@Bean 
public Docket api() {  
    return new Docket(DocumentationType.SWAGGER_2)   
     .select()          
     .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).paths(PathSelectors.any()) 
     .build(); 
} 



// Within your dao or repository class 
public interface QueuedMessageDao extends CrudRepository<QueuedMessage, Integer> { 
    @ApiOperation(value = "This method finds all messages that are queued with the recipient's email address") 
    List<QueuedMessage> findByRecipientEmail(String email); 
} 

Это отрежет много запасных данных на основе весенних данных из вашей документации по чаргу. Но вы все же (удивительно) увидите нежелательные методы HTTP в вашем swagger-ui, например, GET, HEAD и OPTIONS методы для вашего технического /<entity>/search конечной точки. Я говорю технически, потому что эти конечные точки предназначены только для обнаружения других конечных точек, они не обслуживают вас данными из ваших объектов.

Подсказка # 2 - фильтр с помощью PathSelectors

В случае, если вы хотите избавиться от технических /<entity>/search конечных точек в чванством, вы можете исключить их с помощью регулярных выражений, который отфильтровывает все поисковые конечные точки, но сохраняет конечные точки, которые имеют для вас значение. Чтобы все еще иметь конечную точку бизнеса для поиска внутри ваших объектов, вам просто нужно настроить неявную конечную точку GET.

//Example for the method scan based on springfox's @ApiOperation annotation 

@Bean 
public Docket api() {  
    return new Docket(DocumentationType.SWAGGER_2)   
     .select()          
     .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).paths(PathSelectors.regex("^(?!(/.*(/search)$)).*$")) 
     .build(); 
} 

// Within your dao or repository class 
public interface QueuedMessageDao extends CrudRepository<QueuedMessage, Integer> { 

    @ApiOperation(value = "this generates a business search endpoint") 
    List<QueuedMessage> findById(int id); 

    @ApiOperation(value = "This method finds all messages that are queued with the recipient's email address") 
    List<QueuedMessage> findByRecipientEmail(String email); 
} 

Теперь вы избавились от конечной точки поиска, но по-прежнему имеете деловые поиски в документации по swagger. Надеюсь, это поможет!

+0

Мое приложение не имеет @ApiOperation для любого метода. Затем, как я должен предотвратить это (HEAD, OPTIONS, PATCH) в контроллере сущности репозитория, который по умолчанию загружается весной. – SST

+0

вы не можете трогать свои классы репозитория, чтобы представить аннотации swagger? – mika

+0

Могу ли я отключить функцию setHeader («POST, GET, PUT, DELETE») в конфигурации Docket. Возможно ли на уровне конфигурации? – SST

0

У меня была такая же проблема, как и вы, я просто хотел показать операции CRUD своим клиентам через интерфейс Swagger. После копания в документации Springfox я создал свой собственный Predicate для фильтрации конечных точек только для операций CRUD, проверяя запрошенный метод.

@Bean 
public Docket api() { 
    return new Docket(DocumentationType.SWAGGER_2) 
     .select()         
      .apis(customRequestHandlers()) 
      .build(); 
} 

private Predicate<RequestHandler> customRequestHandlers() {  
    return new Predicate<RequestHandler>() { 
     @Override 
     public boolean apply(RequestHandler input) { 
      Set<RequestMethod> methods = input.supportedMethods(); 
      return methods.contains(RequestMethod.GET) 
       || methods.contains(RequestMethod.POST) 
       || methods.contains(RequestMethod.PUT) 
       || methods.contains(RequestMethod.DELETE); 
     } 
    }; 
} 
1

Создание настраиваемого перехватчика:

public class MyInterceptor extends HandlerInterceptorAdapter{  
     @Override 
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
      //let's disable OPTIONS and HEAD 
      if (request.getMethod().equalsIgnoreCase("OPTIONS") || request.getMethod().equalsIgnoreCase("HEAD")) {    
       response.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized Request"); 
       return false; 
      } else { 
       return true; 
      } 
     } 
    } 

Затем добавьте его в конфиг

@Configuration 
@EnableWebMvc 
public class AppConfig extends WebMvcConfigurerAdapter { 
    @Override 
     public void addInterceptors(InterceptorRegistry registry){ 
      registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); 
     } 
} 
0

Без учета конкретного HttpMethods с Springfox-довольно просто с ApiSelectorBuilder, который принимает гуавы Предикатов.

Этот фрагмент исключает все методы из api-docs и swagger-ui.html, которые являются ОПЦИЯМИ, ГОЛОВКОЙ или ПУТЕМ.

@Bean 
public Docket api() { 
    return new Docket(DocumentationType.SWAGGER_2) 
      .select() 
      .apis(Predicates.not(requestHandler -> { 
       // exclude all methods being OPTIONS, HEAD or PATCH 
       final Set<RequestMethod> methods = requestHandler.getRequestMapping().getMethodsCondition().getMethods(); 
       return !Collections.disjoint(methods, Arrays.asList(RequestMethod.OPTIONS, RequestMethod.HEAD, RequestMethod.PATCH)); 
      })) 
      .build(); 
} 

Это может быть легко расширено, чтобы дополнительно исключить обычный контроллер ошибок.

@Bean 
public Docket api() { 
    return new Docket(DocumentationType.SWAGGER_2) 
      .select() 
      .apis(Predicates 
        .and(
          // exclude /errors 
          Predicates.not(requestHandler -> requestHandler.getRequestMapping().getPatternsCondition().getPatterns().contains("/error")), 
          // exclude all methods being OPTIONS, HEAD or PATCH 
          Predicates.not(requestHandler -> !Collections.disjoint(requestHandler.getRequestMapping().getMethodsCondition().getMethods(), 
            Arrays.asList(RequestMethod.OPTIONS, RequestMethod.HEAD, RequestMethod.PATCH))) 
        ) 
      ) 
      .build(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^