Spring 4 中的@PathVariable 验证

Posted

技术标签:

【中文标题】Spring 4 中的@PathVariable 验证【英文标题】:@PathVariable Validation in Spring 4 【发布时间】:2016-05-26 00:45:02 【问题描述】:

如何在春季验证我的路径变量。我想验证 id 字段,因为它唯一的单个字段我不想移动到 Pojo

@RestController
public class MyController 
    @RequestMapping(value = "/id", method = RequestMethod.PUT)
    public ResponseEntity method_name(@PathVariable String id) 
        /// Some code
    

我尝试向路径变量添加验证,但仍然无法正常工作

    @RestController
    @Validated
public class MyController 
    @RequestMapping(value = "/id", method = RequestMethod.PUT)
    public ResponseEntity method_name(
            @Valid 
            @Nonnull  
            @Size(max = 2, min = 1, message = "name should have between 1 and 10 characters") 
            @PathVariable String id) 
    /// Some code
    

【问题讨论】:

您的代码中没有路径变量,至少在您的 URL 中没有,所以不确定需要验证什么... 对不起,我在此处复制和粘贴代码时错过了它 您可以在 method_name 方法中尝试简单的 if 循环,例如 if(id==null || id.length()2) String message = "name should有 1 到 10 个字符”;如果循环结果为真,您可以根据您的要求返回 ResponseEntity, @R.A.S.任何答案对您有帮助吗?还是有其他解决方案/问题? 感谢 Patrick,您的解决方案有效 【参考方案1】:

你需要在你的 Spring 配置中创建一个 bean:

 @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() 
         return new MethodValidationPostProcessor();
    

您应该在控制器上保留@Validated 注释。

您需要在 MyController 类中使用 Exceptionhandler 来处理ConstraintViolationException

@ExceptionHandler(value =  ConstraintViolationException.class )
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public String handleResourceNotFoundException(ConstraintViolationException e) 
         Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
         StringBuilder strBuilder = new StringBuilder();
         for (ConstraintViolation<?> violation : violations ) 
              strBuilder.append(violation.getMessage() + "\n");
         
         return strBuilder.toString();
    

在进行这些更改后,您应该会在验证成功时看到您的消息。

P.S.:我刚刚通过您的@Size 验证进行了尝试。

【讨论】:

我尝试了您的解决方案,但它似乎不起作用。唯一的区别是我有 GET 方法。是分开处理的吗? @NickDiv no 应该是一样的。什么不适合你?也许你应该提出一个问题并在这里评论它的链接。 @Patrick:你能提供完整的源代码吗,我试过了,但仍然无法验证 PathVariable【参考方案2】:

为了存档这个目标,我已经应用了这个解决方法来获得一个响应消息等于一个真实的Validator

@GetMapping("/check/email/email:" + Constants.LOGIN_REGEX + "")
@Timed
public ResponseEntity isValidEmail(@Email @PathVariable(value = "email") String email) 
    return userService.getUserByEmail(email).map(user -> 
        Problem problem = Problem.builder()
            .withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE)
            .withTitle("Method argument not valid")
            .withStatus(Status.BAD_REQUEST)
            .with("message", ErrorConstants.ERR_VALIDATION)
            .with("fieldErrors", Arrays.asList(new FieldErrorVM("", "isValidEmail.email", "not unique")))
            .build();
        return new ResponseEntity(problem, HttpStatus.BAD_REQUEST);
    ).orElse(
        new ResponseEntity(new UtilsValidatorResponse(EMAIL_VALIDA), HttpStatus.OK)
    );

【讨论】:

以上是关于Spring 4 中的@PathVariable 验证的主要内容,如果未能解决你的问题,请参考以下文章

Spring Controller 中的 PathVariable

Spring MVC中的多个@PathVariable

controller中的@PathVariable

Spring MVC @PathVariable注解

@PathVariable详解

Spring mvc @PathVariable