2016-10-07 11 views
4

spring-data-rest-webmvc:jar:2.5.3.RELEASEを使用してREST APIを記述し、リソースをspringfox-data- rest-2.6.0。すべてのメソッドはRestEntityControllerにあります。私は@RestResource(exported = false)を使って、リポジトリレベルでいくつかのメソッドを除外しました。しかし、スワッガーは、他のすべてのHTTPメソッド(OPTIONS、HEAD、PATCHなど)をロードします。これはRepositoryRestResourceから除外できません。spring-data-rest entityControllerからOPTIONS、HEAD、PATCHメソッドを除外する方法

私のCRUDと検索方法だけを含むクリーンなリソースで私の魅力を表現するには? spring-data-rest設定を使用するか、springfox設定を使用するかのどちらかをサポートする必要があります。

+0

難しい質問。 RestEntityControllerのヒントを教えてください。 – mika

答えて

4

springfoxのドキュメントを掘り下げ、行き詰まったアイデアを破棄した後、私はあなたの問題を解決する2つの解決策を思いつきます。必要に応じてそれらを適用し、混合してください。

ヒント#1 - フィルターあなたが闊歩-UIで表示したいと思いどの方法エンドポイントspringfoxを知らせるRequestHandlerSelectors

を使用します。したがって、あなたのアプリケーション全体、特定のパッケージ、またはあなたが共有されたannotationで注釈を付けたクラスとメソッドをスキャンするように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); 
} 

これは、驚くべきドキュメントから多くの春データ休憩オーバーヘッドを遮断します。しかし、技術的な/<entity>/searchエンドポイントでは、GETHEADOPTIONSのような不要なHTTPメソッドがあなたのswagger-uiで表示されます(驚くほど)。これらのエンドポイントは他のエンドポイントのみを検出するためのもので、エンティティからのデータを提供するわけではないため、技術的に言います。

ヒント#2 - あなたが闊歩して技術的な/<entity>/searchのエンドポイントを取り除きたい場合はPathSelectors

を使用して、フィルター、あなたはすべての検索エンドポイントをフィルタリングするが、続けて正規表現を使用してそれらを除外することができますあなたに関連するエンドポイント。エンティティ内の検索のビジネスエンドポイントを引き続き使用するには、暗黙的な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); 
} 

これで、検索エンドポイントはなくなりましたが、まだ迷惑なドキュメントにビジネス検索があります。 これが役立つことを願っています!

+0

私のアプリケーションはどのメソッドに対しても@ApiOperationを持っていません。では、デフォルトでスプリングブートによって提供されるリポジトリエンティティコントローラで、これ(HEAD、OPTIONS、PATCH)をどのように防止するべきですか? – SST

+0

あなたのリポジトリクラスに触れることで、スワッガーアノテーションを導入することはできませんか? – mika

+0

Docket設定でsetHeader( "POST、GET、PUT、DELETE")のように無効にすることはできますか?設定レベルで可能なことはありますか? – SST

0

私はあなたと同じ問題を抱えていましたが、私はSwagger UIを通してクライアントにCRUD操作を表示したかっただけです。 Springfoxのドキュメントを掘り下げた後、私は独自の述語を作成して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

カスタマイズされたインターセプタを作成します。次にSpringfox 2との具体的なHttpMethods除くコンフィグ

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

に追加

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

をグアバ述語を受け入れ、そのApiSelectorBuilderと非常に単純です。

このスニペットは、すべてのメソッドをapi-docsおよびswagger-uiから除外します。htmlはOPTIONS、HEAD、またはPATCHです。

@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(); 
} 

これを簡単に拡張して、common/errorsコントローラをさらに除外することができます。

@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(); 
} 
関連する問題