Je construis actuellement un système Web basé sur Java 7. Il y a plusieurs raisons pour lesquelles je n'utilise pas Java 8 En échange, pour cette raison, le problème était que l'option facultative ne pouvait pas être utilisée.
Facultatif est "Je ne sais pas si l'argument aura une valeur, mais j'essaierai de le recevoir!" Cependant, dans Spring MVC, il est utilisé pour obtenir le paramètre URL exprimé au format REST.
Par exemple, supposons que vous définissiez le contrôleur comme suit:
SampleController.java
@Controller
@RequestMapping("page")
public class SampleController {
@RequestMapping({"", "{num}"})
public ModelAndView getMessages(@PathVariable("num") Optional<String> num) {
if (num.ifPresent()) {
//Si le paramètre est présent
} else {
//Si le paramètre n'existe pas
}
return new ModelAndView("index");
}
}
Il s'agit d'une implémentation qui souhaite traiter la même méthode d'action avec ou sans valeurs de paramètres.
Cette fois, nous supposons les URL http: // localhost / page / 1 '' et
http: // localhost / page ''.
Lorsque la première est demandée, la chaîne de caractères après la deuxième barre oblique (** 1 **) est considérée comme un paramètre, donc ** 1 ** est entré dans l'argument num, et le résultat de ```ifPresent () `` `pour déterminer s'il y avait une entrée est ** true **. Ici, puisque la variable de type est * \ <String > *, il est possible d'obtenir la valeur avec num.get () comme type de chaîne de caractères.
Si cette dernière URL est demandée, il est déterminé que la valeur du paramètre n'existe pas et aucune valeur ** n'est entrée dans l'argument num **. Par conséquent, le résultat du jugement de «« ifPresent () »« est ** faux **.
Dans Java 8 ou version ultérieure, l'implémentation ci-dessus est suffisante. Jusqu'à présent, c'est une méthode courante qui est également introduite sur des sites externes et au sein de Qiita.
Cependant, étant donné que Optional est une classe nouvellement implémentée dans Java8, le programme ci-dessus ne peut pas être utilisé tel quel jusqu'à Java7. J'ai aussi pensé: "Puis-je définir le type d'argument sur * String * et l'obtenir avec * null *?", Mais je lance une ** NullPointerException **.
Vous pouvez l'implémenter en divisant la méthode d'action, mais je ne veux pas vraiment le faire parce que j'ai l'impression d'avoir perdu. (Je ne voulais pas avoir au moins deux de la même source dans la même classe, ou implémenter une méthode privée pour éviter la première. Si vous le faites, je souhaite utiliser la même source. )
Ensuite, ce qu'il faut faire est de créer une classe qui peut être utilisée comme facultative (ci-après, ** classe de paramètres **) et de l'utiliser comme alternative.
SampleParameter.java
public class SampleParameter {
private String num;
//Si vous n'utilisez pas lombok, vous avez besoin de:
// pubric String getNum() { return num; }
// pubric String setNum(String num) { this.num = num; }
boolean ifPresent() {
return num != null;
}
}
SampleController.java
@Controller
@RequestMapping("page")
public class SampleController {
@RequestMapping({"", "{num}"})
public ModelAndView getMessages(@PathVariable("num") SampleParameter num) {
if (num.ifPresent()) {
//Si le paramètre est présent
} else {
//Si le paramètre n'existe pas
}
return new ModelAndView("index");
}
}
Oui, ça ressemble à ça. Comme pour @ ModelAttribute '', il semble que vous créez quelque chose comme une classe de formulaire. En fait, si la classe de paramètres n'a pas le nom de paramètre spécifié par
`` @ RequestMapping```
Soyez prudent car il lance une ** NullPointerException **.
À première vue, on dirait que nous réinventons les roues, mais c'est aussi une classe assez pratique.
Au contraire, les points suivants doivent être pris en compte lors de l'examen de la mise en œuvre.
`@ RequestMapping ({" "," {num} "})` `, vous avez besoin de la méthode`
setNum (Object)
`` `. Recommended Posts