java - Spring Boot HTTP GET 自定义验证

标签 java rest spring-boot groovy

我有一个带有 getMapping 和 pathValue 的 Controller 方法:

@ResponseBody
@Validated
@GetMapping(produces = [MediaType.APPLICATION_JSON_UTF8_VALUE],
value = '/{person}')
PersonResponse getPersonInfo (
    @Valid @PersonValidation
    @PathVariable('person') String personId,
    BindingResult bindingResult
    ) {
//  Abort if received data is not valid
    if (bindingResult.hasErrors()) {
        throw new BadHttpRequest()
}

我想要实现的是使用我的自定义验证 @PersonValidation 验证 uri 的 personId,但它不起作用,代码没有给出任何错误,但程序永远不会进入我的自定义验证类...

¿我该如何解决这个问题? ¿如何使用自定义验证来验证我的路径变量?

最佳答案

我的问题已经解决了。 Spring 在验证路径变量方面存在一些问题...... 首先,您需要添加一个带有 MethodValidationPostProcessor 的配置类,如下所示:

/**
* this class is required to use our custom path variable validation on 
* the controller class
*/
@Configuration
class ValidatorConfiguration {

    @Bean
    MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor()
    }
}

现在,在 Controller 类上,重要的是添加@Validated注解

@RestController
@Validated
class YourController class {
}

现在您对路径变量的自定义验证将起作用,如果您想捕获异常,请在异常处理程序类中添加此方法:

@ControllerAdvice
class GlobalExceptionHandler {
    @ExceptionHandler(value = [ ConstraintViolationException.class ])
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    String handle(ConstraintViolationException e) {
        Set<ConstraintViolation<?>> violations = e.getConstraintViolations()
        StringBuilder strBuilder = new StringBuilder()
        for (ConstraintViolation<?> violation : violations ) {
            strBuilder.append(violation.getMessage() + "\n")
        }
        return strBuilder.toString()
    }
}

关于java - Spring Boot HTTP GET 自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46069805/

相关文章:

java - Spring 启动: automatic JSON message converter for @Requestbody GET doesn't work

java - 按 Enter 键时将单元格更改为编辑模式

java - 什么集合支持多个同时插入?

java - 如何将枚举与分组和子分组层次结构/嵌套一起使用

java - 再次在派生类中添加Jackson中的字段,该字段在基类中已被忽略

node.js - 默认情况下,哪些客户端可以/不能访问 RESTful Web 服务?

node.js - 我为什么现在要获得“ “A data breach on a site or app exposed your password. Chrome recommends changing your password on ” SITENAME”。

.NET MVC - 在同一 Controller 中使用 ActionName() 的多个 GET 方法

从方法引用的 java.lang.IllegalArgumentException 在类加载器中不可见

mysql - Spring Boot JPA MySQL : Failed to determine a suitable driver class