Java создает пользовательский класс исключений с определенным кодом состояния - PullRequest
0 голосов
/ 24 февраля 2019

В Spring Boot я создаю пользовательский класс исключений с определенным кодом состояния и вызываю его для выдачи исключения с кодом: 100 и сообщением «Нет содержимого» на контроллере, но вывод все еще возвращает «состояние»: 500 и «ошибка ":" Внутренняя ошибка сервера "

AppException.java

public class AppException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    private final Integer code;

    public AppException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }
}

UserController.java

@RestController
@RequestMapping("/api/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping()
    public ApiResponseDto getAllUsers(Pageable pageable) {
        Page<User> users = userService.getAllUsers(pageable);

        if (users.getSize() < 0) {
            throw new AppException(100, "No have content");
        }

        return new ApiResponseDto(HttpStatus.OK.value(), users);
    }

Фактический результат:

{
    "timestamp": 1550987372934,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "com.app.core.exception.AppException",
    "message": "No have content",
    "path": "/api/user"
}

Мои ожидания:

{
    "timestamp": 1550987372934,
    "status": 100,
    "error": "No have content",
    "exception": "com.app.core.exception.AppException",
    "message": "No have content",
    "path": "/api/user"
}

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Для этого есть несколько способов:

  1. ExceptionHandler

    Вы можете добавить аннотированный метод @ExceptionHandler в свой контроллер:

    @ExceptionHandler({ CustomException1.class, CustomException2.class })
    public void handleException() {
    //
    }
    
  2. HandlerExceptionResolver

    Вы также можете реализовать собственный распознаватель, чтобы перехватывать все исключения и обрабатывать их глобально, переопределяя метод doResolveException

Более подробно о вышеупомянутых двух подходах можно найти здесь: https://www.baeldung.com/exception-handling-for-rest-with-spring

0 голосов
/ 24 февраля 2019

Если вам нужно ограниченное количество различных сообщений об ошибках или вы хотите использовать одно и то же несколько раз, то это все, что вам нужно:

@ResponseStatus(value = HttpStatus.CONTINUE, reason = "No have content")
public class AppException extends RuntimeException {
    private static final long serialVersionUID = 1L;
}

Нет необходимости в дополнительных классах и обработчиках.Ваш код будет понятен и прост.

Вы можете просто поднять его так:

throw new AppException();
0 голосов
/ 24 февраля 2019

Если вы хотите иметь глобальную обработку исключений для своего API и предпочитаете настраивать ответы об ошибках, вы можете добавить @ControllerAdvice:

@ControllerAdvice
public class ApiExceptionHandler {

    @ExceptionHandler({ ApiException.class })
    protected ResponseEntity<ApiErrorResponse> handleApiException(ApiException ex) {
        return new ResponseEntity<>(new ApiErrorResponse(ex.getStatus(), ex.getMessage(), Instant.now()), ex.getStatus());
    }
}

// you can put any information you want in ApiErrorResponse 
public class ApiErrorResponse {

    private final HttpStatus status;
    private final String message;
    private final Instant timestamp;

    public ApiError(HttpStatus status, String message, Instant timestamp) {
        this.status= status;
        this.message = message;
        this.timestamp = timestamp;
    }

    public HttpStatus getStatus() { 
        return this.status; 
    }

    public String getMessage() {
        return this.message;
    }

    public Instant getTimestamp() {
        return this.timestamp;
    }
}

// your custom ApiException class
public class ApiException extends RuntimeException {

    private final HttpStatus status;

    public ApiException(HttpStatus status, String message) {
        super(message);
        this.status = status;
    }

    public HttpStatus getStatus() {
        return this.status;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...