@PathVariable
パス変数がURLにない場合はnullを返しますか?それ以外の場合は、2つのハンドラを作成する必要があります。 /simple
と別の/simple/{game}
、ただし、ゲームが定義されていない場合でも、リストから最初の1つを選択するだけで同じですが、ゲームパラメータが定義されている場合は、それを使用します。
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable("example") String example,
HttpServletRequest request) {
そして、これはページを開こうとしたときに得られるものです/simple
:
原因:Java.lang.IllegalStateException:@RequestVappingに@PathVariable [例]が見つかりませんでした
オプションにすることはできません。それが必要な場合は、それらを処理する2つのメソッドが必要です。
これはパス変数の性質を反映しています-それらがnullであることは実際には意味がありません。 RESTスタイルのURLには、常に完全なURLパスが必要です。オプションのコンポーネントがある場合は、代わりにリクエストパラメータにすることを検討してください(つまり、@RequestParam
)。これはオプションの引数にはるかに適しています。
他の人がすでにNoと述べているように、パスパラメータを明示的に述べた場合、それらがnullであることを期待することはできません。ただし、回避策として以下のようなことを行うことができます-
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable Map<String, String> pathVariablesMap,
HttpServletRequest request) {
if (pathVariablesMap.containsKey("game")) {
//corresponds to path "/simple/{game}"
} else {
//corresponds to path "/simple"
}
}
Spring 4.1およびJava 8を使用している場合、Spring MVCで@RequestParam
、@PathVariable
、@RequestHeader
および@MatrixVariable
でサポートされているJava.util.Optionalを使用できます。
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable Optional<String> game,
HttpServletRequest request) {
if (game.isPresent()) {
//game.get()
//corresponds to path "/simple/{game}"
} else {
//corresponds to path "/simple"
}
}
あなたはいつでもこれを行うことができます:
@RequestMapping(value = "/simple", method = RequestMethod.GET)
public ModelAndView gameHandler(HttpServletRequest request) {
gameHandler2(null, request)
}
@RequestMapping(value = "/simple/{game}", method = RequestMethod.GET)
public ModelAndView gameHandler2(@PathVariable("game") String game,
HttpServletRequest request) {
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable(value="example",required = false) final String example)
このアプローチを試してみてください、それは私のために働きました。
私は今これをテストしましたが、上記のソリューションを組み合わせることでこれを得ました:
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable(value = "game", required = false) String example,
HttpServletRequest request) {
if (example != null) {
//...
} else {
//pick first, ...
}
}
「/ simple」を使用すると、例外をスローする代わりに、文字列の例がnullになります。
簡潔なソリューション、派手なオプションはありません<>またはマップ<>