Существует следующий метод из класса контроллера:
@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?




Почему вы пытаетесь опубликовать 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.