#java #spring
#java #весна
Вопрос:
Существует следующий метод из класса контроллера:
@GetMapping("{id:" REGEXP "}")
@ResponseBody
public SomeObject getById(@PathVariable UUID id) {
return someObjectService.getById(id));
}
РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ — это простая строка регулярного выражения. В someObjectService метод GetById обрабатывает случай, когда объект не может быть найден по идентификатору, и выдает исключение. Для таких случаев также существует класс обработчика исключений для настройки ответа на ошибку:
@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
с некоторым несуществующим идентификатором, который проходит проверку регулярных выражений, ожидаемый результат = достигнутый результат: 404, а тело ошибки в формате json имеет структуру CustomErrorResponse
(из обработчика).
Однако, когда я делаю то же самое с id, который НЕ проходит проверку регулярных выражений — происходит 404, НО тело ошибки json по умолчанию (bootstrap), оно не CustomErrorResponse
имеет структуры.
Вопрос в том, какое исключение может быть выдано и где (для его дальнейшей соответствующей обработки), когда id in @GetMapping("{id:" REGEXP "}")
не проходит проверку регулярного выражения?
Ответ №1:
Если вы хотите создать регулярное выражение, чтобы проверить, является ли uuid правильным, что это не обязательно и
@GetMapping("/{id}")
public SomeObject getById(@PathVariable UUID id) {
подтвердит это.
С другой стороны, если у вас более строгие требования к этому, чем вам нужно, используйте средство проверки шаблонов:
@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
Ответ №2:
Почему вы пытаетесь опубликовать json в своем get mapping? В этом случае вам нужно будет использовать 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 /