34

@PathVariableパス変数がURLにない場合、nullを返すようにすることは可能ですか? それ以外の場合は、2 つのハンドラーを作成する必要があります。1つと/simpleもう/simple/{game}1つですが、ゲームが定義されていない場合はどちらも同じですが、リストから最初の1つを選択しますが、ゲームパラメーターが定義されている場合はそれを使用します。

@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable("example") String example,
            HttpServletRequest request) {

そして、これはページを開こうとしたときに得られるものです/simple:

原因: java.lang.IllegalStateException: @RequestMapping で @PathVariable [example] が見つかりませんでした

4

6 に答える 6

37

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

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

于 2011-03-30T23:48:05.987 に答える
36

他の人が既に言及しているように、パスパラメーターを明示的に言及した場合、それらが 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 でサポートされている java.util.Optional を@RequestParam使用できます@PathVariable@RequestHeader@MatrixVariable

@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"
    }           
}
于 2016-01-08T06:32:49.670 に答える
19

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

@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) {
于 2011-12-12T17:45:42.580 に答える