java - JSR - Spring Boot 的 Spring @RestController 的 349 bean 验证

标签 java spring-mvc spring-boot bean-validation jsr

我正在使用 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.jarhibernate-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/

相关文章:

java - 在 Android 应用程序上使用锅炉管道

java - Selenium TestNG 不同维度的相同测试

java - 如何在 Spring 中排除/禁止 validator 中的字段

java - wsimport 为列表创建包装类

Java Unix 设置属性

javascript - 使用 Javascript 动态实现 Spring Security

spring-mvc - Spring MVC CRUD Controller 最佳实践

java.lang.IllegalArgumentException : Cannot instantiate interface org. springframework.context.ApplicationContextInitializer

java - 将 bcrypt 添加到 Spring Boot Security

spring - RabbitMQ - StompBrokerRelayMessageHandler - 收到错误{消息=[连接不良]