Wie behalten Sie den integrierten REST-Antwort-JSON-Body von Spring mit einer @ControllerAdvise (und @RestControllerAdvise) -Klasse?

8

Wenn Sie in Spring 4.x @RestControllerAdvise (oder @ControllerAdvice ) verwenden, das ResponseEntityExceptionHandler erweitert, wird die standardmäßige Ausnahmebehandlung mit netten und informativen JSON-Antworthauptteilen nicht mehr standardmäßig für Argumente zurückgegeben, die als markiert sind @Valid .

Wie erhalten Sie die Standard-JSON-Körper, die zurückgegeben werden, während Sie ResponseEntityExceptionHandler based @RestControllerAdvice verwenden?

Das folgende ist ein einfaches, aber vollständiges Beispiel, das diese Frage beschreibt. Verwenden Sie diese Klassen:

%Vor%

Wenn Sie eine POST an /cars mit

senden %Vor%

Er antwortet mit einem 400 und dem folgenden Text:

%Vor%

Wenn Sie jedoch die Ausnahmebehandlungsmethode in eine eigene Klasse mit der Bezeichnung @RestControllerAdvice verschieben, die sich von ResponseEntityExceptionHandler wie folgt erstreckt:

%Vor%

Sie erhalten 400 mit einem leeren body , was dadurch verursacht wird, dass ResponseEntityExceptionHandler eine Methode liefert ( handleMethodArgumentNotValid(..) ), die eine Antwort aufbaut, in der der Körper null ist .

Wie würden Sie diese @RestControllerAdvice -Klasse ändern, um die ursprüngliche Behandlung auszulösen, die auftritt, die einen JSON-Text liefert, der beschreibt, warum die übermittelte Anfrage ungültig ist?

    
peterl 01.04.2017, 05:57
quelle

2 Antworten

2

Wie wäre es damit?

%Vor%

Wenn @Valid fehlschlägt, wird BindException ausgelöst. Mit dem kannst du so umgehen. oder Sie können einfach throw e ausführen, was Ihnen genau die gleiche Antwort geben würde wie zuvor.

    
pvpkiran 09.05.2017 12:11
quelle
0

Ein Ansatz ist, dass es für mich funktioniert, ResponseEntityExceptionHandler

nicht zu verlängern

So würde die Ergebnisklasse aussehen:

%Vor%

Siehe aber auch: Ambiguous @ExceptionHandler-Methode zugeordnet für [class org.springframework.web.bind.MethodArgumentNotValidException]

    
csviri 30.10.2017 11:15
quelle