2017-03-28 61 views
5

Zaimplementowałem interfejs API REST przy użyciu aplikacji rozruchu sprężynowego. Wszystkie moje interfejsy API zwracają obecnie odpowiedź w formacie JSON dla każdej jednostki. Ta odpowiedź została wykorzystana przez inny serwer, który oczekuje, że wszystkie te odpowiedzi będą miały ten sam format JSON. Na przykład;Jak zmienić odpowiedź kontrolera w filtrze, aby struktura odpowiedzi była spójna w całym interfejsie API przy użyciu rozruchu sprężynowego

Wszystkie moje odpowiedzi powinny być uwzględnione w poniższej strukturze;

public class ResponseDto { 
    private Object data; 
    private int statusCode; 
    private String error; 
    private String message; 
} 

Obecnie wiosna-boot zwraca odpowiedzi o błędach w innym formacie. Jak to osiągnąć za pomocą filtra.

Format komunikatu o błędzie;

{ 
    "timestamp" : 1426615606, 
    "exception" : "org.springframework.web.bind.MissingServletRequestParameterException", 
    "status" : 400, 
    "error" : "Bad Request", 
    "path" : "/welcome", 
    "message" : "Required String parameter 'name' is not present" 
} 

muszę zarówno błąd i powodzeniem wykonano odpowiedzi znajdują się w tej samej strukturze json całego mojego wniosku wiosna-boot

Odpowiedz

3

ten można osiągnąć jedynie poprzez wykorzystanie ControllerAdvice i obchodzić wszystkie możliwe wyjątki, a następnie powrót do odpowiedzi twój własny wybór.

@RestControllerAdvice 
class GlobalControllerExceptionHandler { 

    @ResponseStatus(HttpStatus.OK) 
    @ExceptionHandler(Throwable.class) 
    public ResponseDto handleThrowable(Throwable throwable) { 
     // can get details from throwable parameter 
     // build and return your own response for all error cases. 
    } 

    // also you can add other handle methods and return 
    // `ResponseDto` with different values in a similar fashion 
    // for example you can have your own exceptions, and you'd like to have different status code for them 

    @ResponseStatus(HttpStatus.OK) 
    @ExceptionHandler(CustomNotFoundException.class) 
    public ResponseDto handleCustomNotFoundException(CustomNotFoundException exception) { 
     // can build a "ResponseDto" with 404 status code for custom "not found exception" 
    } 
} 

Some great read on controller advice controller handlers

+0

Jak dostaję komunikat o błędzie i kod błędu wewnątrz tej metody handlethrowable() – Achaius

+0

@Achaius przepraszam pisałam przykładem złego, można dostać wiadomość od parametru do 'handleThrowable() 'metoda, a mianowicie' throwable' w tym przykładzie. Ale nie można ustalić kodu statusu, ponieważ wykorzystując tę ​​strukturę, nadpisujesz dowolny kod stanu Wiosna określa wstępnie w zależności od typu wyjątku. Ale w większości przypadków będzie to 500, więc możesz podać kod statusu 500 z wiadomością o natywnych wyjątkach, a dla własnych wyjątków aplikacji możesz mieć oddzielną procedurę obsługi z różnymi kodami statusu. –

+0

Czy istnieje sposób, aby to zrobić w servletFilter – Achaius