Wie kann ich den Antwortstatuscode und die Daten im Antworthauptteil anpassen, wenn eine Ausnahme in einer Spring Boot-Webanwendung auftritt?Spring Boot anpassen HTTP-Fehlerreaktion?
Ich habe eine Webanwendung erstellt, die eine benutzerdefinierte Ausnahme auslöst, wenn aufgrund eines schlechten internen Status etwas unerwartetes auftritt. Folglich wird der Antworttext des Antrags, der den Fehler ausgelöst sieht ungefähr so aus:
HTTP/1.1 500 Internal Server Error
{
"timestamp": 1412685688268,
"status": 500,
"error": "Internal Server Error",
"exception": "com.example.CustomException",
"message": null,
"path": "/example"
}
Nun, ich möchte den Statuscode ändern und die Felder im Antworttext festgelegt. Eine Lösung, die meinen Kopf gegangen war so etwas wie:
@ControllerAdvice
class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
ErrorMessage handleBadCredentials(CustomException e) {
return new ErrorMessage("Bad things happened");
}
}
@XmlRootElement
public class ErrorMessage(
private String error;
public ErrorMessage() {
}
public ErrorMessage(String error) {
this.error = error;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
)
jedoch, dass erstellt (wie vermutet) eine ganz andere Antwort:
HTTP/1.1 400 Bad Request
{
"error": "Bad things happened"
}
Also beide Sie tun und nicht wollen, eine eigene Antwort? – zeroflagL
@zeroflag Vorzugsweise möchte ich die Antwort, die von Spring Boot (wenn möglich) generiert wird, anpassen. Das Implementieren einer vollständigen benutzerdefinierten Lösung (wie der in der Frage bereitgestellten) funktioniert, ist jedoch zwischen verschiedenen Projekten weniger wiederverwendbar. – matsev
Es liegt ganz bei Ihnen, ob die benutzerdefinierte Lösung wiederverwendbar ist oder nicht. FWIW: Der Resposne-Body wird von 'DefaultErrorAttributes # getErrorAttributes' zusammengestellt. Sie können diese Klasse in Ihren 'CustomResponseEntityExceptionHandler' injizieren. – zeroflagL