2016-04-21 19 views
2

にマッピングされません私はCrudControllerと呼ばれる、私はすべての私の基本的なCRUDコントローラの継承私の最新のWebアプリケーションプロジェクトのための基本春のコントローラを作成しました:継承コントローラメソッドはRequestMapping

class CrudController<T, K extends Serializable> 

Tでありますエンティティタイプ、Kはそのタイプに使用されるキーです(SpringのCrudRepositoryに必要なパラメータはかなりです)。私はそうのように、それを拡張することで、残りのコントローラを作成します。

@RestController 
@RequestMapping(path = "/hats") 
public class HatController extends CrudController<Hat, Integer> { 
} 

すべてが項目、/hatsのリストを取得する方法を除いて、素晴らしい作品。この方法では、405 Method Not Allowedを取得します。起動時に行われたログを見ると、RequestMappingHandlerMappingが{[/hats],methods=[GET]}にマップされていないことがわかりますが、コントローラの他の4つのメソッドをマップしています。ここでマップされていないメソッドのコードは次のとおりです。

@RequestMapping(method = RequestMethod.GET) 
public HttpEntity<?> getAll() { 
    Iterable<T> result = controllerRepository.findAll(); 
    return new ResponseEntity<Object>(result, HttpStatus.OK); 
} 

多くの実験の後、私は方法は意志、私はクラス・パラメータの種類の一つであるのgetAllメソッドにパラメータを追加する場合ことを発見しましたマップされます。この非常に類似したコードをチェックアウト:その小さなコード変更に伴い

@RequestMapping(method = RequestMethod.GET) 
public HttpEntity<?> getAll(K dontuse) { 
    Iterable<T> result = controllerRepository.findAll(); 
    return new ResponseEntity<Object>(result, HttpStatus.OK); 
} 

を、/find呼び出しが正常に動作します。私はそこにダミーのパラメータを保持することができ、すべてがうまくいくが、においがする。

アイデア?問題を複製簡素化プロジェクトは、ここで見つけることができます:

Simple Project

答えて

3

Class#getDeclaredMethods()は、スーパークラスからそれぞれ継承されたメソッドのためのブリッジMethodを返しherehereは、として宣言バグレポートを参照して、現在のJavaのバグがありますパッケージプライベート。 javadocに基づいて、それを行うべきではありません。

これは、Spring MVCの注釈付きクラスとハンドラメソッドの@Controllerの検査を混乱させます。この回答の詳細はあまり役に立ちませんが、それを扱うコードはhereです。

最も簡単な解決策は、CrudRepositoryクラスをpublicと宣言することです。

public class CrudController<T, K extends Serializable> 
+1

これはすばらしいトラブルシューティングです。+1 – dimitrisli