@Gültiges JSON-Anfrage mit BindingResult Ursachen IllegalStateException
Ich habe einen REST-service, der JSON-Anfrage. Ich will zur Validierung der JSON-Anfrage Werte, die kommen in. Wie kann ich das tun?
Im Frühjahr 3.1.0 RELEASE, ich weiß, man will zu machen sicher Sie sind mit der neuesten support-Klassen, aufgeführt im 3.1.13 Neue HandlerMethod-basierte Support-Klassen Für die Anmerkungen Controller-Verarbeitung
Die alten Elemente wie: AnnotationMethodHandlerAdapter
. Ich will zu machen sicher, ich bin mit dem neuesten wie RequestMappingHandlerAdapter
.
Dies ist, weil ich hoffe, es behebt ein Problem, wo ich sehen:
java.lang.IllegalStateException: Fehler/BindingResult argument deklariert, ohne vorhergehende Modell-Attribut. Überprüfen Sie Ihre handler-Methode Signatur!
Meine @Controller
handler-Methode und zugehörige code ist:
@Autowired FooValidator fooValidator;
@RequestMapping(value="/somepath/foo", method=RequestMethod.POST)
public @ResponseBody Map<String, String> fooBar(
@Valid @RequestBody Map<String, String> specificRequest,
BindingResult results) {
out("fooBar called");
//get vin from JSON (reportRequest)
return null;
}
@InitBinder("specificRequest") //possible to leave off for global behavior
protected void initBinder(WebDataBinder binder){
binder.setValidator(fooValidator);
}
FooValidator
sieht wie folgt aus:
@Component
public class FooValidator implements Validator {
public boolean supports(Class<?> clazz) {
out("supports called ");
return Map.class.equals(clazz);
}
public void validate(Object target, Errors errors) {
out("validate called ");
}
private void out(String msg) {
System.out.println("****** " + getClass().getName() + ": " + msg);
}
}
Wenn ich entfernen Sie die BindingResult
funktioniert alles einwandfrei, außer, dass ich nicht in der Lage zu sagen, wenn der JSON-validiert.
Ich bin nicht stark befestigt, um das Konzept der Verwendung einer Map<String, String>
für das JSON-request oder über einen separaten validator im Gegensatz zu einer Benutzerdefinierten Bean mit validation-annotation (Wie machst du das, dass für ein JSON-Anfrage?). Was auch immer überprüfen kann, ob der JSON-Anfrage.
InformationsquelleAutor finneycanhelp | 2012-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte etwas ähnliches einmal. Ich habe gerade endete damit, mein Leben einfacher durch das erstellen eines Java-Objekts, dass die JSON-könnte konvertieren in und
GSON
um die Konvertierung zu tun.Es war, ehrlich gesagt, so einfach wie:
Alles tun, Ihre Validierung in Ihrem benutzerdefinierten
Validator
Klasse:MyCustomObject
enthält keine-Anmerkung für die Validierung, das ist, weil ansonsten die Feder wird versuchen, die Validierung dieser Felder in diesem Objekt sind derzeit leer, da alle Daten in der JSON-String, es könnte zum Beispiel sein:Lösung fordert Validator explizit und sollte dies durch das Spring-framework.
InformationsquelleAutor Ali
3.1.17 @Gültig Auf @RequestBody Controller-Methode Argumente sagt, dass:
In anderen Worten, wenn Sie verwenden
@Valid @RequestBody
dann wird der Frühling lehnen eine ungültige Anforderung, bevor er bekommt so weit wie das aufrufen Ihrer Methode. wenn Sie die Methode ist aufgerufen wird, dann kann davon ausgegangen werden den Hauptteil der Anfrage gültig ist.BindingResult
wird verwendet für die Validierung der form/command-Objekte, sondern als@RequestBody
.Wir haben versucht, das entfernen BindingResult und die Validierung nicht funktioniert hat.
Wir sind mit JSR303 und ich bin mit diesem problem mit null-Werten in der model-Klasse. Ich würde gerne den Fehler zurück, den Blick, sondern deren Handhabung in der DefaultHandler feuert die MethodArgumentNotValidException. Ich denke, es ist zu spät für mich zu handhaben, sanft auf diesen Punkt.
Hier ist ein Beispiel der
MethodArgumentNotValidException
Behandlung: dzone.com/articles/spring-31-valid-requestbodyInformationsquelleAutor skaffman
Versuchen Sie, die folgenden:
Diesem machen Ihren controller zu serialisieren der Anfrage in der Art, die Sie angeben, es zu sein.
Ich muss sagen, dass ich normalerweise dont make-a-service (autowired) der validator, aber es könnte besser sein.
Ihre handler sieht jetzt wie folgt aus:
Meines Wissens das funktioniert perfekt und behebt die Fehler, die Sie erhalten.
InformationsquelleAutor fonZ