web-dev-qa-db-ja.com

@PathVariableが見つからない場合、nullを返すことができますか?

@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 [例]が見つかりませんでした

28
Rihards

オプションにすることはできません。それが必要な場合は、それらを処理する2つのメソッドが必要です。

これはパス変数の性質を反映しています-それらがnullであることは実際には意味がありません。 RESTスタイルのURLには、常に完全なURLパスが必要です。オプションのコンポーネントがある場合は、代わりにリクエストパラメータにすることを検討してください(つまり、@RequestParam)。これはオプションの引数にはるかに適しています。

31
skaffman

他の人がすでに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"
    }           
}
27
Aniket Thakur

あなたはいつでもこれを行うことができます:

@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) {
19
Shawn K.
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable(value="example",required = false) final String example)

このアプローチを試してみてください、それは私のために働きました。

1
user10222941

私は今これをテストしましたが、上記のソリューションを組み合わせることでこれを得ました:

@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になります。

簡潔なソリューション、派手なオプションはありません<>またはマップ<>

0
Thanh Nguyen