要验证路径变量,您可以使用自定义验证器。您可以定义自定义验证器@NotNumber 以确保路径变量不是数字。不需要显式检查 null,因为 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 接口
@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);
}
}
正则表达式模式可以根据您的要求进行调整。