Как отловить `Ошибка обработки запроса` для ошибки параметра клиента при весенней загрузке? - PullRequest
5 голосов
/ 18 марта 2020

Я регистрирую DateTimeFormatterRegistrar в своем классе реализует WebMvcConfigurer следующим образом:

@Override
public void addFormatters(FormatterRegistry registry) {
    DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
    registrar.setUseIsoFormat(true);
    registrar.registerFormatters(registry);
}

В контроллере остальных я пытаюсь проанализировать параметры клиента GET для объекта:

@GetMapping("/api/url/path")
public APIResponse getPersonAttendList(@Valid SampleVO vo){}

SampleVO включает поле LocalDateTime time. Если клиент предложил неверный формат time param, привязка будет неудачной. Сервер вернет 500 и напечатает некоторый журнал, например:

>ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] 175 - Servlet.service() for
servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; 
nested exception is java.time.format.DateTimeParseException

У меня вопрос, как перехватить это исключение и вернуть 400 клиенту ? Кажется, ControllerAdvice не работает.

Ответы [ 5 ]

3 голосов
/ 14 апреля 2020

В моем проекте я использую @RestControllerAdvice для обработки таких случаев, например:


@RestControllerAdvice
public class MyCustomExceptionsHandler {
    @ExceptionHandler({HttpMessageNotReadableException.class})
    public ResponseEntity handleException(HttpMessageNotReadableException httpMessageNotReadableException) {
         //return the response entity you need here with the correct error
    }
}

Это то, что работает для меня.

0 голосов
/ 15 апреля 2020

Если вы хотите отловить все исключения Spring в совете контроллера, то вам нужно отловить Exception.class и затем проверить имя класса исключения.

@Slf4j
@RestControllerAdvice(basePackages = "com.your.package.name")
public class ErrorWrapper {

    @ExceptionHandler(Exception.class)
    public APIResponse handleException(Exception ex, WebRequest request) {
        if (ex.getClass().getCanonicalName().startsWith("org.springframework.")) {
            return APIResponse.fromError(new ClientError(ex.getMessage()));
        }
        return APIResponse.fromError(new ServerError());
    }

}
0 голосов
/ 15 апреля 2020

Окружите этот оператор (DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar ()) в блоке try catch.

try{
    DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
} catch (Exception e) {
    e.printStacktrace();
}
0 голосов
/ 15 апреля 2020

Извините. Я сделал ошибку здесь. Во-первых, я планирую вернуть клиенту все ответы, например

@Getter
@Setter
@AllArgsConstructor
public class APIResponse {
    private Integer status;
    private String msg;
    private Object data;

    @NotNull
    public static APIResponse fromData(Object data) {
        return new APIResponse(0, "", data);
    }

    @NotNull
    public static APIResponse fromError(@NotNull BaseError err) {
        return new APIResponse(err.getStatus(), err.getMsg(), null);
    }

    @NotNull
    public static APIResponse fromError(@NotNull BaseError err, Object data) {
        return new APIResponse(err.getStatus(), err.getMsg(), data);
    }

    @NotNull
    public static APIResponse fromEmpty() {
        return new APIResponse(0, "", null);
    }
}

Я сделал глобальную ошибку: 500.

Существует так много исключений для весенней загрузки, я не знаю, как поймать их всех и вернуть 400, не пропустив ни одного.

0 голосов
/ 13 апреля 2020

Вы должны быть в состоянии поймать это с помощью "try {}, catch () {} и, наконец, {}". Вы попробуете код и затем поймаете исключение, а затем вернете ошибку 400 клиенту.

try {
    //your code
} catch (java.time.format.DateTimeParseException e) {
    //Return 400 here
} finally {
    //Other code here
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...