@RequestMapping(value = "/contact.html", method = RequestMethod.POST)
public final ModelAndView contact(
@RequestParam(value = "name", required = false) Optional<String> name) {
Comment le code @RequestMapping
de Spring gère-t-il un Optional
from Bibliothèque de goyaves si la valeur du paramètre n'est pas obligatoire et que rien n'est envoyé?
Qu'il sera:
null
Optional.absent()
Optional.fromNullable(T)
peut-il être utilisé pour accepter la demande?
EDIT (octobre 2015): Spring 4 gère le Java.util.Optional
(depuis Java 8) dès l'installation et garantit que Optional
n'est pas null, mais la question originale concernait le com.google.common.base.Optional
de Guava, dont l'utilisation en tant que @RequestParam
est fortement déconseillée. dans ce cas particulier (parce que peut être null).
RÉPONSE ORIGINALE (à propos de la Optional
de Guava):
Ne faites pas cela, utilisez simplement String
et laissez Spring gérer null
.
Optional<T>
est supposé être utilisé comme valeur de retour et rarement comme paramètre. Dans ce cas particulier, Spring mappera le paramètre "name"
manquant sur null
. Ainsi, même si, après avoir implémenté la personnalisation éditeur de propriétés , vous terminez avec la vérification null
:
@RequestMapping("foo")
@ResponseBody
public String foo(@RequestParam(required = false) final Optional name) {
return "name: " + (name == null ? "null" : name.get());
}
ce qui est complètement inutile (et les missus Optional
), car cela peut être réalisé avec:
@RequestMapping("foo")
@ResponseBody
public String foo(@RequestParam(required = false) final String name) {
return "name: " + (name == null ? "null" : name);
}
Je recommande d'utiliser la version Java 8: Java.util.Optional
. Consultez la documentation Oracle dans http://www.Oracle.com/technetwork/articles/Java/java8-optional-2175753.html . Mettez également un nom dans la variable, spécialement si vous utilisez Spring 3 ou plus:.
import Java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class LoginController
{
private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView getLoginPage(@RequestParam(name = "error", required = false) Optional<String> errorMsg)
{
//error.ifPresent(LOGGER::debug); //Java 8 with Optional
return new ModelAndView("login", "error", errorMsg);
}
}
Java.util.Optional
est très utile pour gérer les paramètres facultatifs, comme errors dans Spring.
La réponse à votre question sera un paramètre facultatif dont la première est la valeur null.
Dans Spring HandlerMethodInvoker, j'ai trouvé la méthode resolRequestParam.
Object paramValue = null;
...
if (multipartRequest != null) {
...
// Check if this is multipart request and set paramValue in this case.
}
// Otherwise
if (paramValue == null) {
String[] paramValues = webRequest.getParameterValues(paramName);
if (paramValues != null) {
paramValue = (paramValues.length == 1 ? paramValues[0] : paramValues);
}
}
if (paramValue == null) {
if (defaultValue != null) {
paramValue = resolveDefaultValue(defaultValue);
}
else if (required) {
raiseMissingParameterException(paramName, paramType);
}
...
}
...
Nous vérifions d’abord s’il s’agit d’une requête en plusieurs parties. Sinon, nous obtenons les valeurs de paramètres par nom de paramètre à partir de la requête servlet. Enfin, si la valeur du paramètre null, nous vérifions si le paramètre est requis. Si nécessaire, nous lançons une exception, sinon nous retournons null.