我正在使用 Spring Boot 1.5.2.RELEASE 并且无法为 @RequestParam
合并 JSR-349(bean 验证 1.1) & @PathVariable
在方法本身。
对于 POST 请求,如果方法参数是 Java POJO,则用 @Valid
注释该参数工作正常但注释 @RequestParam
& @PathVariable
用类似 @NotEmpty
的东西, @Email
不工作。
我已经用 Spring 的 @Validated
注释了 Controller 类
关于SO的问题很多,我在this answer上发表了评论它不适合我。
Spring Boot 包括 - validation-api-1.1.0.Final.jar
和 hibernate-validator-5.3.4.Final.jar
.
我错过了什么吗?
示例代码,
@RequestMapping(method = RequestMethod.GET, value = "/testValidated", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseBean<String> testValidated(@Email @NotEmpty @RequestParam("email") String email) {
ResponseBean<String> response = new ResponseBean<>();
response.setResponse(Constants.SUCCESS);
response.setMessage("testValidated");
logger.error("Validator Not called");
return response;
}
当我为 email
发送空值或格式不正确的电子邮件地址时,永远不会调用以下处理程序& 控制总是在 testValidated
中进行方法。
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseBean handle(ConstraintViolationException exception) {
StringBuilder messages = new StringBuilder();
ResponseBean response = new ResponseBean();
exception.getConstraintViolations().forEach(entry -> messages.append(entry.getMessage() + "\n"));
response.setResponse(Constants.FAILURE);
response.setErrorcode(Constants.ERROR_CODE_BAD_REQUEST);
response.setMessage(messages.toString());
return response;
}
ResponseBean<T>
是我的应用程序特定类。
最佳答案
经过两天多的点击和试用失败后,我提出了这个问题。由于围绕 Spring Validations 和 JSR 验证、Spring 如何调用 JSR validator 、JSR 标准的更改以及支持的验证类型存在混淆,因此存在许多令人困惑的答案。
最后,this article帮助很大。
我分两步解决了问题,
1. 将以下 bean 添加到我的 Configuration
- 没有这些 bean,什么也做不了。
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor mvProcessor = new MethodValidationPostProcessor();
mvProcessor.setValidator(validator());
return mvProcessor;
}
@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setProviderClass(HibernateValidator.class);
validator.afterPropertiesSet();
return validator;
}
2.在我的 Controller 上放置 Spring 的 @Validated 注释,如下所示,
@RestController
@RequestMapping("/...")
@Validated
public class MyRestController {
}
验证是 - org.springframework.validation.annotation.Validated
此设置不影响同一 Controller 中用于 @RequestBody
验证的 @Valid
注释,并且它们继续按原样工作。
现在,我可以为 MyRestController
类中的方法触发如下验证,
@RequestMapping(method = RequestMethod.GET, value = "/testValidated" , consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseBean<String> testValidated(
@Email(message="email RequestParam is not a valid email address")
@NotEmpty(message="email RequestParam is empty")
@RequestParam("email") String email) {
ResponseBean<String> response = new ResponseBean<>();
....
return response;
}
我必须在异常处理程序中添加另一个处理程序以处理异常 - ConstraintViolationException
虽然因为 @Validated
抛出此异常而 @Valid
抛出 MethodArgumentNotValidException
关于java - JSR - Spring Boot 的 Spring @RestController 的 349 bean 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44320678/