2016-05-02 13 views
1

私はスプリングブートを使用しています。私は、Webアプリケーションにログインしようとするとスプリングブートあいまいなハンドラ

@RequestMapping(value = "/user/{userId}", method = RequestMethod.GET) 
public UserAppDto getNameByUserId(@PathVariable("userId") Long userId) { 
    return userService.getByUserId(userId); 
} 

@RequestMapping(value = "/user/{username}", method = RequestMethod.GET) 
public UserAppDto getNameByUsername(@PathVariable("username") String username) { 
    return userService.getNameByUsername(username); 
} 

、私が手に:私は論文2つのメソッドを作成し

java.lang.IllegalStateException: HTTPパス 'http://localhost:8080/rest/user/bsmith' のマッピングされたあいまいなハンドラメソッドを: {公共 com.zenar.dto.UserAppDto com.zenar.controller.UserController.getNameByUsername(java.lang.Stringで)、 公共com.zenar.dto.UserAppDto com.zenar.controller.UserController.getNameByUserId(ジャワ。 lang.Long)}

データ型に違いはありません。

URLを変更する必要がありますか?最新リリースの修正URLは、複数のパターンが一致したときSpring MVC documentationによると

+0

正しい:この問題を修正するための一つの方法は、それらの1 より具体的なを作ることです。また質問がありますか? – dunni

+2

HTTPにはテキストしかありません。 Springはある変換を行いますが、実際の人間だけが '123'はユーザ名ではないことを知っています(誰かがそれを使ってユーザをユーザ名として作成しないと言っています)。あなたは何かを制限する正規表現を含めることによってそれを動作させることができるかもしれませんが、私はそれを信じません。 –

答えて

3

、ソートが最も具体的なマッチを見つけるために使用されます。

URI変数とワイルドカードの下の数とパターンが もっと考えられています特定。たとえば、/hotels/{hotel}/*は1つのURI 変数と1つのワイルドカードを持ち、1つのURI変数と2つのワイルドカードとして /hotels/{hotel}/**より具体的であると考えられます。

2つのパターンのカウント数が同じ場合は、より具体的には とみなされます。例えば、/foo/bar*はより長く、 は/foo/*より具体的であると考えられます。

2つのパターンのカウントと長さが同じ場合は、 のワイルドカードが少ないパターンがより具体的と見なされます。例えば、 /hotels/{hotel}は、/hotels/*より具体的です。

これらのルールを適用した後、Spring MVCがどちらをより具体的に決定できなかった場合、その例外がスローされます。

@RequestMapping(value = "/user/{userId:\\d+}", method = RequestMethod.GET) 
public UserAppDto getNameByUserId(@PathVariable("userId") Long userId) { 
    return userService.getByUserId(userId); 
} 
+1

ここでのトリックは、[URIパターンの正規表現]を指定できることです(http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann -requestmapping-uri-templates-regex)を使用します。 – Jesper

関連する問題