@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
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.
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"
}
}
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) {
@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.