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

#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 /