10

In meinem Controller habe ich String-Parameter, der eine ID enthält, die nicht leere Zeichenfolge sein sollte. Ich frage mich, gibt es eine Möglichkeit zu überprüfen, es ist nicht leer String in @RequestMapping params? Ich habe versucht, es in gewisser Weise ohne ErfolgSo überprüfen Sie den Anfrageparameter ist nicht leer String in @RequestMapping params?

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

zu lösen. Wie ich verstanden habe, können sowohl params = {"id"} als auch @RequestParam(required = true) nur prüfen, ob der Parameter id in der Anforderung (! = Null) angezeigt wird.

Es ist sehr wahrscheinlich, dass ich, dass in der Steuerung boby mit Code zu überprüfen, wie

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

aber bitte korrigieren Sie mich, wenn ich falsch. Vielen Dank im Voraus.

P.S. Meine App läuft auf Java 1.7 SE in Apache Tomcat 7.0.62 Container

Antwort

6

Nach dem Frühling Code, dass

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

So etwas sollte funktionieren:

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

Mir ist aufgefallen, dass 'required = true' nicht einmal notwendig ist, da ich einen Status 400 bekommen habe, als ich ein Headerfeld weggelassen habe: '{" status ": 400," error ":" Bad Request "," exception ":" org.springframework.web.bind.ServletRequestBindingException "," message ":" Fehlender Anfrage-Header 'X-Custom-Header' für Methodenparameter vom Typ String "," path ":"/api/"}' – user3105453

+0

Danke, denke ich Das ist das, was ich benötige. Wenn ich die Annotation so definierte, wie Sie es vorgeschlagen hatten, den Breakpoint zu Beginn der Controller-Methode setzen und den Test ausführen, kam ich a) nicht in die Controller-Methode; b) habe selbst erklärte Ausnahme org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Parameter Bedingungen "ID! =" für tatsächliche Anfrage Parameter nicht erfüllt: id = {}. – WeGa

7

Wenn Sie Java EE konform mit Validierungen sein möchten, verwenden Sie @Size(min=1).

Hibernate Validator hat @NotEmpty Annotation für diesen Zweck. Aber das ist nicht Teil der Java-Spezifikation.

BTW, keep required=true wie oben Benachrichtigungen würde Präsenz der Param in Anfrage nicht erzwingen.

EDIT Reaktion auf Kommentar:

Frühling ist Java EE Validation-konform, so @size Annotation sollte funktionieren, wenn Sie einige Java EE Validierung API implmentor auf Klassenpfad haben. Ich habe bisher nur den Hibernate Validator benutzt. So können Sie diese Validierungsfunktionen, indem Sie diesen in Classpath aktivieren:

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

, als Sie Ihren Controller mit @Validated Annotation annotieren kann und dies tun:

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

Sie auch Fehlermeldung anpassen können, das wird an den Kunden gesendet werden.

Wenn Sie mit der Java EE-Validierung nicht vertraut sind, würde ich vorschlagen, sich damit zu befassen, da es sehr wichtig ist, wenn Sie einen REST/HTTP-Endpunkt erstellen. Es wird dir eine neue Welt eröffnen.

Start with Java EE Tutorial for validation

Relevant part of Spring doc

+0

Danke für Ihre Antwort. Ich habe meinen Beitrag mit Umgebungsbeschreibung aktualisiert. Ich bin mir nicht sicher, ob es mit der von Ihnen angebotenen Lösung kompatibel ist. Können Sie mir bitte sagen, was passiert wäre, wenn der Eingabeparameter diese Annotationsbeschränkungen verletzt? Wie soll ich in diesem Fall mit einer solchen Situation umgehen? – WeGa

-4

können Sie verwenden defaultValue wie in

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

Aber wieder werden Sie ein verwenden, wenn wie

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

Ansonsten können Sie erstellen ein Filter für diesen Zweck ose, wie in diesem Beispiel gegeben

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

+0

Nicht sehr hilfreich ... –

+0

Danke für die Antwort. Aber ist meine manuelle Parameterüberprüfung nicht besser als Ihre Lösung? – WeGa

+0

Nicht nur "nicht sehr hilfreich", sondern einfach falsch. 'defaultValue' wird nur verwendet, wenn der Parameter nicht angegeben ist und nicht das Szenario" war leer "umfasst. – kryger