web-dev-qa-db-fra.com

Comment @RequestParam dans Spring traite-t-il les options de Guava?

@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:

  • Régler sur null
  • Régler sur Optional.absent()

Optional.fromNullable(T) peut-il être utilisé pour accepter la demande?

29
Anders

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);
}
47
Xaerxess

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.

4
EliuX

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.

0
mvb13