【问题标题】:how to validate path variable in spring data rest?如何验证春季数据休息中的路径变量?
【发布时间】:2020-06-17 14:50:28
【问题描述】:

我的问题很简单。我正在使用 Spring Data REST,这意味着我默认获取所有端点,并且我正在尝试验证路径。所以假设我有

/user/{string} [GET operation]

假设这只能是字母,我想验证它以确保它不为空或数字,我该如何实现?

我知道这样做的一种方法是覆盖控制器,这样我就可以在参数进入时访问它并且我可以验证它。但这对于这么简单的事情来说似乎太过分了。

【问题讨论】:

  • 在这种情况下,正确的响应是返回 404,这是默认控制器将执行的操作。
  • 这能回答你的问题吗? Customize endpoints with Spring Data REST
  • @OrangeDog 不,抱歉,我调查了它并没有帮助。
  • 为什么需要验证 ID?正如 OrangeDog 所说,如果 ID 不是数字或 ID 不存在于数据库中,Spring Data REST 会以 404 响应。ID 验证是不必要的。如果您的真实路径变量不是 ID,请使用该变量而不是 ID 作为示例。
  • 这是一个字符串值我已经更新了问题

标签: spring-boot spring-data-rest


【解决方案1】:

要验证路径变量,您可以使用自定义验证器。您可以定义自定义验证器@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);
        }
    }

正则表达式模式可以根据您的要求进行调整。

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 2016-01-30
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多