как проверить переменную пути в весенних данных? - PullRequest
0 голосов
/ 17 июня 2020

Мой вопрос очень простой. Я использую Spring Data REST, что означает, что я получаю все конечные точки по умолчанию и пытаюсь проверить путь. Допустим, у меня есть

/user/{string} [GET operation]

Допустим, это могут быть только буквы, и я хочу проверить это, чтобы убедиться, что оно не равно нулю или числу, как я могу этого добиться?

Я знаю один из способов сделать это - переопределить контроллер, который предоставит мне доступ к параметру по мере его поступления, и я могу его проверить. Но для такой простой вещи это кажется чересчур.

1 Ответ

0 голосов
/ 02 июля 2020

Для проверки переменных пути вы можете использовать настраиваемые валидаторы. Вы можете определить собственный валидатор @NotNumber, чтобы убедиться, что переменная пути не является числом. Явная проверка на null не требуется, поскольку переменная пустого пути вернет 404.

Controller- TestController.class

    @RestController
    @RequestMapping("/")
    @Validated
    public class TestController {
    
        @PostMapping("/test/{testVariable}")
        public void signUp(@PathVariable @NotNumber String testVariable) {
            System.out.println(testVariable);
        }
    
        @ExceptionHandler(ConstraintViolationException.class)
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        ResponseEntity<String> handleConstraintViolationException(ConstraintViolationException e) {
            return new ResponseEntity<>("Validation Error: " + e.getMessage(), HttpStatus.BAD_REQUEST);
        }
    }

Не забудьте добавить @Validated поверх класса контроллера. Эта аннотация по умолчанию возвращает код состояния 505. Чтобы вернуть 404, мы можем добавить обработчик исключений, как показано выше.

@ NotNumber interface

    @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = NotNumberImpl.class)
    public @interface NotNumber {
        String message() default "The value of path variable must be String";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }

NotNumberImpl.class - реализация валидатора

    public class NotNumberImpl implements ConstraintValidator<NotNumber, String> {
        @Override
        public void initialize(NotNumber constraintAnnotation) {
        }
    
        @Override
        public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
            String regex = "^[0-9]";
            return s.matches(regex);
        }
    }

Шаблон регулярного выражения можно настроить в соответствии с вашими требованиями.

...