Исключение аннотации Spring GetMapping

Существует следующий метод из класса контроллера:

    @GetMapping("{id:" + REGEXP + "}")
    @ResponseBody
    public SomeObject getById(@PathVariable UUID id) {
        return someObjectService.getById(id));
    }

REGEXP — это простая строка регулярного выражения. В someObjectService метод getById обрабатывает случай, когда объект не может быть найден по id и выдает исключение. Для таких случаев также существует класс обработчика исключений для настройки ответа на ошибку:

    @ExceptionHandler({ResourceNotFoundException.class})
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ResponseBody
    public CustomErrorResponse handleNotFoundCase (ResourceNotFoundException exception) {
        CustomErrorResponse customerErrorResponse = new CustomErrorResponse();
        // filling CustomErrorResponse with specific data using 'exception'
        return customerErrorResponse;
    }

Итак, когда я тестирую getById с каким-то несуществующим идентификатором, который проходит проверку REGEXP, ожидаемый результат = достигнутый результат: 404, а json тело ошибки имеет структуру CustomErrorResponse (из обработчика).

Однако, когда я делаю то же самое с id, который НЕ проходит проверку REGEXP - возникает 404, НО json тело ошибки по умолчанию (бутстрап), оно не имеет CustomErrorResponse структуры.

Вопрос: какое исключение могло быть выброшено и где (для его дальнейшей соответствующей обработки), когда id в @GetMapping("{id:" + REGEXP + "}") не проходит проверку regexp?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
474
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Почему вы пытаетесь опубликовать json в своем сопоставлении? В этом случае вам нужно будет использовать localhost:8080/yourApp/entity/{id:10} Это действительно то, что вам нужно вместо localhost:8080/yourApp/entity/10?

Пожалуйста, взгляните на эту страницу о том, как должны быть спроектированы конечные точки REST: https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design

Что касается вашего вопроса - вы не можете использовать проверку в таком случае. Вам нужно добавить свой собственный валидатор для этого поля Пожалуйста, найдите раздел «Пользовательский валидатор» здесь: https://www.mkyong.com/spring-boot/spring-rest-validation-example/

Ответ принят как подходящий

Если вы хотите создать регулярное выражение для проверки правильности uuid, в этом нет необходимости и

@GetMapping("/{id}")
public SomeObject getById(@PathVariable UUID id) {

подтвердит это.

С другой стороны, если у вас есть более строгие требования к этому, чем вам нужно использовать валидатор Pattern:

@RestController
@Validated
public class Ctrl {
    // ...
    @GetMapping("/{id}")
    public String getById(@Pattern(regexp = REGEXP) @PathVariable String id) {
        return someObjectService.getById(UUID.fromString(id)));
    }

}

Обратите внимание, что средство проверки шаблона не работает с типом UUID, поэтому вам необходимо вручную преобразовать строку в UUID.

Подробнее о проверке можно прочитать в статье https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/validation.html.

Другие вопросы по теме