10

Nel mio controller ho un parametro String, contenente qualche id, che non dovrebbe essere nullo di stringa vuota. Mi chiedo, c'è un modo per controllare che non sia vuota String nei parametri @RequestMapping? ho cercato di risolverlo in qualche modoCome controllare il parametro request non è vuoto String in parametri @RequestMapping?

@RequestMapping(value = someURL, params = {"id"}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 

@RequestMapping(value = someURL, params = {"!id="}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 

@RequestMapping(value = someURL, params = {"!id=\"\""}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 

senza successo. Come ho capito, sia params = {"id"} sia @RequestParam(required = true) possono solo verificare che il parametro id sia presentato in richiesta (! = Null).

è più probabile che devo controllare che con il codice di controllo boby, come

if (id == null || id.isEmpty()) { 
    return someErrorResponse; 
} 

ma per favore mi corregga se sbagliato. Grazie in anticipo.

P.S. la mia app è in esecuzione su Java 1.7 SE nel contenitore Apache Tomcat 7.0.62

risposta

6

Secondo il codice sorgente che consuma che annotazione

org.springframework.web.servlet.mvc.annotation.ServletAnnotationMappingUtils.checkParameters(String[], HttpServletRequest) 

Qualcosa del genere dovrebbe funzionare:

@RequestMapping(value = someURL, params = {"id!="}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 
+0

Ho notato che 'required = true' non è nemmeno necessario in quanto ho ottenuto lo stato 400 quando ho omesso un campo di intestazione: '{" status ": 400," error ":" Bad Request "," exception ":" org.springframework.web.bind.ServletRequestBindingException "," message ":" Intestazione richiesta mancante 'X-Custom-Header' per parametro metodo di tipo String "," percorso ":"/api/"}' – user3105453

+0

Grazie, penso questo è ciò di cui ho bisogno. Quando ho definito l'annotazione nel modo in cui hai proposto, inserito il punto di interruzione all'inizio del metodo del controller ed eseguito il test, I a) non è entrato nel metodo del controller; b) ha ottenuto l'eccezione auto-spiegata org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Condizioni dei parametri "id! =" non soddisfatte per i parametri di richiesta effettivi: id = {}. – WeGa

7

Se si desidera che Java EE sia compatibile con le convalide, utilizzare @Size(min=1).

Hibernate Validator ha l'annotazione @NotEmpty per questo scopo. Ma questo non fa parte delle specifiche Java.

BTW, mantenere required=true come sopra le notifiche non imporrebbe la presenza del param nella richiesta.

reazione EDIT al commento:

primavera è Java EE convalida compatibile, l'annotazione in modo @Size dovrebbe funzionare se avete un po 'di Java EE convalida API implmentor sul percorso di classe. Finora ho usato solo il validatore di ibernazione. Così si può attivare queste funzioni di convalida aggiungendo questo in classpath:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>5.2.1.Final</version> 
</dependency> 

di quanto si può annotare il controller con @Validated annotazione e fare questo:

@RequestMapping(value = someURL, params = {"id"}) 
public SomeResponse doSomething(@RequestParam(required = true) @Size(min=1) String id) 

È possibile anche personalizzare il messaggio di errore che verrà essere inviato al cliente

Se non si ha familiarità con la convalida Java EE, suggerirei di iniziare a esaminarla poiché è molto importante se si sta creando un endpoint REST/HTTP. Aprirà un nuovo mondo per te.

Start with Java EE Tutorial for validation

Relevant part of Spring doc

+0

Grazie per la risposta. Ho aggiornato il mio post con la descrizione dell'ambiente che ho. Non sono sicuro che sia compatibile con la soluzione che hai offerto. Potresti dirmi, per favore, cosa sarebbe successo se il parametro di input violasse questi vincoli di annotazione? Come dovrei gestire tale situazione in quel caso? – WeGa

-4

È possibile utilizzare defaultValue come in

@RequestParam(value = "id", required = true, defaultValue = "-1") String id 

Ma, ancora una volta si dovrà utilizzare una se come

if(id.equals("-1")){ 
    return "someErrorPage" 
} 

In caso contrario è possibile creare un filtro per questo purp ose, come indicato in questo esempio

How to use a servlet filter in Java to change an incoming servlet request url?

+0

Non molto utile ... –

+0

Grazie per la risposta. Ma il mio parametro di controllo manuale non è migliore della tua soluzione? – WeGa

+0

Non solo "non molto utile", ma semplicemente sbagliato. 'defaultValue' è usato solo se il parametro non è specificato, non copre lo scenario" era vuoto ". – kryger

Problemi correlati