Question

Est-il possible de faire le @PathVariable renvoyer null si la variable path n'est pas dans l'url ?Sinon, je dois créer deux gestionnaires.Un pour /simple et un autre pour /simple/{game}, mais les deux font la même chose si aucun jeu n'est défini, j'en choisis un en premier dans une liste, mais s'il y a un paramètre de jeu défini, je l'utilise.

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

Et voici ce que j'obtiens en essayant d'ouvrir la page /simple:

Causé par:java.lang.IllegalStateException :Impossible de trouver @PathVariable [exemple] dans @RequestMapping

Était-ce utile?

La solution

Ils ne peuvent pas être facultatifs, non.Si vous en 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 nécessitent toujours le chemin complet de l'URL.Si vous disposez d'un composant facultatif, envisagez plutôt d'en faire un paramètre de requête (c'est-à-direen utilisant @RequestParam).Ceci est bien mieux adapté aux arguments facultatifs.

Autres conseils

Comme d'autres l'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 solution de contournement :

@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.Optional qui est pris en charge 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"
    }           
}

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

Essayez cette approche, cela a fonctionné pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top