Для проверки переменных пути вы можете использовать настраиваемые валидаторы. Вы можете определить собственный валидатор @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);
}
}
Шаблон регулярного выражения можно настроить в соответствии с вашими требованиями.