我有一个带有 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/