2011-03-30 46 views
18

如果路徑變量不在url中,可以使@PathVariable返回null嗎?否則,我需要做兩個處理程序。一個用於/simple,另一個用於/simple/{game},但兩者都是一樣的,只要沒有定義遊戲,我會從列表中選擇第一個遊戲,但如果有遊戲參數定義,那麼我使用它。如果找不到它,@PathVariable可以返回null嗎?

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

這是我在嘗試打開/simple頁面時:

產生的原因:java.lang.IllegalStateException:找不到@PathVariable [示例]在@RequestMapping

回答

21

他們不能是可選的,不。如果你需要,你需要兩種方法來處理它們。

這反映了路徑變量的性質 - 它們沒有意義,它們是空的。 REST風格的URL總是需要完整的URL路徑。如果您有可選組件,請考慮將其設爲請求參數(即使用@RequestParam)。這更適合於可選參數。

+0

謝謝! :)將檢查'@ RequestParam'。 – Rihards 2011-03-30 23:55:49

+0

但是,正弦v4.3.3 Spring支持'@PathVariable(value =「siteId」,required = false)String siteId',儘管我還沒有找到一種方法*不提供路徑變量*或將其留空或空。 – Alex 2017-09-15 14:08:49

17

你總是可以只是這樣做:

@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) { 
17

正如其他人已經提到不,你不能指望當你已經明確提到的路徑參數,它們是空的。如果你在Spring MVC中

使用Spring 4.1和Java 8可以使用java.util.Optional這是在 @RequestParam支持, @PathVariable@RequestHeader@MatrixVariable

@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" 
    }   
} 

- 但是你可以做類似下面的解決方法

@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" 
    }   
} 
+4

謝謝,這應該是被接受的答案 – membersound 2016-02-04 16:43:18

+0

謝謝,這是一個更好的解決方案。 – drafterr 2018-01-23 07:30:47

相關問題