2017-11-29 17 views
0

私は春ブーツ、春データREST、春HATEOASは、Hibernate、JPAを使用しています。カスタムコントローラ

私は自分のアプリケーションで広く春データRESTを使用していると私は私のエンティティのすべてのリポジトリを公開します。 残念ながら、管理しにくい特定のケースがあります。 ことの一つはこれです:

私は、カスタムコントローラました:

@Api(tags = "CreditTransfer Entity") 
@RepositoryRestController 
@RequestMapping(path = "/api/v1") 
@PreAuthorize("isAuthenticated()") 
public class CreditTransferController { 

@RequestMapping(method = RequestMethod.GET, path = "/creditTransfers/{id}") 
    public ResponseEntity<?> findAll(@PathVariable("id") long id, HttpServletRequest request, Locale locale, 
      PersistentEntityResourceAssembler resourceAssembler) { 
     //my code 

    } 

    @RequestMapping(method = RequestMethod.DELETE, path = "/creditTransfers/{id}") 
    public ResponseEntity<?> deleteMovement(@PathVariable("id") long id, HttpServletRequest request, Locale locale, 
      PersistentEntityResourceAssembler resourceAssembler) { 
     //my code 
    } 

ここでの問題は、これらのエンドポイントをオーバーライドし、私は春データRESTを作成/検索エンドポイントを隠していますということです。それは私にとって非常に重要です。

私はこの春、データRESTから提供されたデフォルトのエンドポイントと干渉しなくても動作できるようにする任意のスマートな方法を見つけるdid't。

私の問題を解決する方法はありますか?

============================================== ========================

小さな増強が、このようなマッピングを使用している。このように

@RequestMapping(method = RequestMethod.DELETE, path = "/creditTransfers/{id:[0-9]+}") 

するコントローラを私はGET localhost:8080/api/v1/creditTransfersしようとすると、私はちょうどDELETEメソッドをオーバーライドする場合は、まだURL localhost:8080/api/v1/creditTransfers/searchをキャッチしませんが、私はエラーRequest method 'GET' not supportedをしました。私のコントローラは、設定したパスだけでなく、特定のパスのすべてのメソッドをオーバーライドしているようです。

+0

コントローラーの権利ではなく、リポジトリーのURLを上書きしたいですか? –

+0

@AmrAlaaまた、実装をオーバーライドする必要があります。実際には、DELETEの実装をオーバーライドする必要がありました。 urlは、Spring Data RESTが提供するデフォルトのリポジトリと同じです。それが問題です。 – drenda

答えて

1

としては、あなたが@RepositoryRestController@RequestMappingであなたのコントローラに注釈を付けるならば、あなたはあなたのための「デフォルト」のRESTエンドポイントを生成する春の利益を失い、このthreadで説明すると、もともとhere

@Api(tags = "CreditTransfer Entity") 
@RepositoryRestController 
@PreAuthorize("isAuthenticated()") 
public class CreditTransferController { 

    @GetMapping("/api/v1/creditTransfers/{id}") 
    public ResponseEntity<?> findAll(@PathVariable("id") long id, HttpServletRequest request, Locale locale, 
      PersistentEntityResourceAssembler resourceAssembler) { 
     //my code 

    } 

    @DeleteMapping("/api/v1/creditTransfers/{id}") 
    public ResponseEntity<?> deleteMovement(@PathVariable("id") long id, HttpServletRequest request, Locale locale, 
      PersistentEntityResourceAssembler resourceAssembler) { 
     //my code 
    } 

} 

サイドノート: これを防止するための唯一の方法は、すなわち、自動的に生成されたエンドポイントとカスタムエンドポイントの両方を取得するには、唯一のメソッドレベルのrequestmappingを使用することです私はまた、マッピングがGetMappingDeleteMappingショートカットを使用しました。

+0

ありがとう、あなたは私に多くの時間と欲求不満を救った! – drenda

0

あなたがリポジトリに上書きしたいの方法に比べて

@RestResource(exported=false) 

を追加することができます。

+0

残念ながらそのアノテーションを使用しても私の問題は解決しません。実際にhttp:// localhost:8080/api/v1/creditTransfers/searchにアクセスしようとすると、PageNotFound:252 - Requestメソッド 'GET'がサポートされていません。私のコントローラは、DELETEメソッド(私のメソッド)のpath = "/ creditTransfers/{id}"がURL http:// localhost:8080/api/v1/creditTransfers/searchに一致するため、コントローラがSpring Data RESTを優先しているため、これを推測します – drenda

関連する問題