2013-11-27 22 views
29
@RequestMapping(value = "/contact.html", method = RequestMethod.POST) 
public final ModelAndView contact(
     @RequestParam(value = "name", required = false) Optional<String> name) { 

Come Spring @RequestMapping gestire un Optional dal Guava library se il valore del parametro non è richiesto e nulla viene inviato?In che modo @RequestParam in Spring gestisce Opava di Guava?

Sará:

  • Imposta per null
  • Imposta per Optional.absent()

Può Optional.fromNullable(T) essere utilizzato per accettare la richiesta?

+1

Credo che sarà "null", perché Spring non sa nulla di Guava, almeno per impostazione predefinita. –

+0

Potrebbe essere possibile registrare un 'PropertyEditor' per dire a Spring come convertire il parametro di richiesta' name' in 'Optional'. http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/validation.html#beans-beans-conversion –

+2

Non esiste una cosa come 'Optional.of (null) ~. –

risposta

47

EDIT (ottobre 2015): Primavera 4 maniglie java.util.Optional (da Java 8) fuori dalla scatola e garantisce che Optional sé non è nulla, ma domanda iniziale era di circa com.google.common.base.Optional di Guava, che uso come @RequestParam è altamente sconsigliato in questo caso specifico (perché è possibile essere nullo).

RISPOSTA ORIGINALE (circa Optional di Guava):

non farlo, basta usare String e lasciare gestire Primavera null a suo modo.

Optional<T> deve essere utilizzato come return value e raramente come parametro. In questo caso particolare primavera mapperà manca "name" parametro null, quindi, anche se dopo l'implementazione personalizzata property editor finirete con null controllo:

@RequestMapping("foo") 
@ResponseBody 
public String foo(@RequestParam(required = false) final Optional name) { 
    return "name: " + (name == null ? "null" : name.get()); 
} 

che è completamente inutile (e missuses Optional), perché può essere raggiunto con:

@RequestMapping("foo") 
@ResponseBody 
public String foo(@RequestParam(required = false) final String name) { 
    return "name: " + (name == null ? "null" : name); 
} 
+0

per quanto ne so l'ultima versione di Spring funziona bene con jdk Tipo opzionale – Yura

+0

@Yura Spring 4 gestisce ['java.util.Optional'] (https://docs.oracle.com/javase/8/docs/api/ java/util/Optional.html) out of the box, ma sono abbastanza sicuro che ['com.google.common.base.Optional'] (http://docs.guava-libraries.googlecode.com/git- history/release/javadoc/com/google/common/base/Optional.html) (che OP utilizza) non è supportato. – Xaerxess

+0

methodName (@RequestParam ("appRefNo") String appRefNo, \t \t \t \t \t \t \t \t @RequestParam (value = "appStatus", required = false) String appStatus) –

0

La risposta alla tua domanda sarà parametro facoltativo prima è impostato su null.

Nella primavera HandlerMethodInvoker ho trovato il metodo resolveRequestParam

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); 
     } 
     ... 
    } 
    ... 

Quindi, prima controlliamo se si tratta di una richiesta più parti. Altrimenti otteniamo i valori dei parametri in base al nome del parametro dalla richiesta servlet. Infine, se il valore del parametro null, controlliamo se è necessario un parametro. Se richiesto, lanciamo un'eccezione, altrimenti restituiamo null.

4

Si consiglia di utilizzare la versione Java 8: java.util.Optional. Guarda la documentazione Oracle in http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html. Inserisci anche un nome per la variabile, specialmente se usi Spring 3 o superiore :.

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 è molto utile per la gestione parametrers opzionali, come errori in primavera.

+0

Non è il nome del parametro specificato con valore invece di nome? – jbird

+0

Come si può vedere qui https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html, value è un alias del nome – EliuX

+0

Sto usando come muggito \t search (@RequestParam ("appRefNo") String appRefNo, @RequestParam (value = "appStatus", required = false) String appStatus) {} –

Problemi correlati