Spring Boot: как настроить ответ JSON в случае ошибки (с помощью ControllerAdvice) - PullRequest
0 голосов
/ 29 марта 2019

Использование Spring Boot Rest API: у меня есть конечная точка, которую я использую для входа пользователя.Если учетные данные пользователя недействительны, генерируется исключение UnauthorizedException с пользовательским сообщением.

Используя пользовательское исключение и объект ErrorDetails, я соответственно установил ответ на сообщение об ошибке.

Однако япродолжайте получать ответ JSON от Spring Boot, содержащий обширный заголовок.Как мне настроить заголовок так, чтобы он возвращал только то, что я хочу видеть?

Это сообщение JSON, которое я получаю в ответ.Однако я предпочел бы получить только ошибку: {} ее часть.

</p> <pre><code>{ "headers": { "normalizedNames": {}, "lazyUpdate": null }, "status": 401, "statusText": "OK", "url": "http://localhost:8080/access/login", "ok": false, "name": "HttpErrorResponse", "message": "Http failure response for http://localhost:8080/access/login: 401 OK", "error": { "message": "Invalid username and/or password.", "details": "uri=/access/login", "timestamp": "2019-03-29T14:52:28.863+0000" } }

Это код, используемый для ControllerAdvice,ErrorDetails и UnauthorizedException:

</p> <pre><code>public class ErrorDetails { private String message; private String details; private Date timestamp; public ErrorDetails(String message, String details, Date timestamp) { super(); this.message = message; this.details = details; this.timestamp = timestamp; } public String getMessage() { return message; } public String getDetails() { return details; } public Date getTimestamp() { return timestamp; } public void setMessage(String message) { this.message = message; } public void setDetails(String details) { this.details = details; } public void setTimestamp(Date timestamp) { this.timestamp = timestamp; } } @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(UnauthorizedException.class) public ResponseEntity<ErrorDetails> unauthorizedException(UnauthorizedException e, WebRequest webRequest) { ErrorDetails errorDetails = new ErrorDetails(e.getMessage(), webRequest.getDescription(false),new Date()); return new ResponseEntity<>(errorDetails, HttpStatus.UNAUTHORIZED); } @ExceptionHandler(Exception.class) public ResponseEntity<?> globalExceptionHandler(Exception e, WebRequest webRequest) { ErrorDetails errorDetails = new ErrorDetails(e.getMessage(), webRequest.getDescription(false),new Date()); return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR); } } @ResponseStatus(value = HttpStatus.UNAUTHORIZED) public class UnauthorizedException extends Exception { private static final long serialVersionUID = 1L; public UnauthorizedException(String message) { super(message); } }

1 Ответ

0 голосов
/ 29 марта 2019

Это пример того, что у меня работает нормально:

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {

        @ExceptionHandler(value = IllegalArgumentException.class)
        protected ResponseEntity<Object> handleInvalidBody(IllegalArgumentException ex, WebRequest request) {
            return handleExceptionInternal(ex, "Error message", new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
        }
    }

Когда вы бросаете, IllegalArgumentException будет обрабатываться этим.

...