@PathVariable peut-il retourner null s'il n'est pas trouvé?

Est-il possible de faire les @PathVariable pour retourner la valeur null si la variable de chemin d'accès n'est pas dans l'url? Sinon j'ai besoin de faire deux gestionnaires. Une pour /simple et un autre pour /simple/{game}, mais les deux font la même chose juste s'il n'y a pas de jeu défini je choisis d'abord un d'une liste cependant s'il y a un param de jeu défini alors je l'utilise.

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

Et c'est ce que j'obtiens lorsque j'essaie d'ouvrir la page /simple:

causé par: java.lang.IllegalStateException: impossible de trouver @PathVariable [exemple] @RequestMapping

21
demandé sur skaffman 2011-03-31 03:44:24

4 réponses

ils ne peuvent pas être optionnels, non. Si vous avez besoin, vous avez besoin de deux méthodes pour les gérer.

cela reflète la nature des variables de chemin - cela n'a pas vraiment de sens qu'elles soient nulles. Les URL de style REST ont toujours besoin du chemin complet de L'URL. Si vous avez un composant optionnel, envisagez de le transformer en paramètre de requête à la place (c.-à-d. en utilisant @RequestParam). Ceci est beaucoup mieux adapté aux arguments optionnels.

23
répondu skaffman 2011-03-30 23:48:05

comme d'autres ont déjà mentionné Non, vous ne pouvez pas vous attendre à ce qu'ils soient nuls lorsque vous avez explicitement mentionné les paramètres de chemin. Cependant, vous pouvez faire quelque chose comme ci-dessous comme une solution -

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

si vous utilisez Spring 4.1 et Java 8, Vous pouvez utiliser java.util.Optionnel qui est supporté dans @RequestParam, @PathVariable,@RequestHeader et @MatrixVariable au printemps MVC

@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"
    }           
}
24
répondu Aniket Thakur 2016-01-08 06:44:47

Vous pouvez toujours juste faire ceci:

@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) {
18
répondu Shawn K. 2011-12-12 17:45:42
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable(value="example",required = false) final String example)

essayez cette approche, ça a marché pour moi.

0
répondu user10222941 2018-08-14 07:27:04