2016-09-20 203 views
0

使用Spring Boot 1.4和Spring Data Rest/MVC我无法获得@Valid @RequestBody的工作。我已经尝试过多个版本的Hibernate Validator,声明Validator beans等。没有运气。春季休眠验证@RequestBody

@BasePathAwareController 
@RestController 
public class TestRestController extends BaseController { 
    @PostMapping("/pojo/save") 
    public @ResponseBody ResponseEntity<?> upload(@Valid @RequestBody MyPojo pojo) { 
    // Code here calling a repository.save. 
} 

MyPojo包含各种验证注解即@digits,@NotNull,等我真正看到验证异常时repostiory.save方法被调用,但春节不试图对POJO任何验证。

这里是我的POM的包括弹簧的依赖部分:

 <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-rest</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
      <exclusions> 
       <exclusion> 
        <groupId>org.apache.tomcat</groupId> 
        <artifactId>tomcat-jdbc</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-mail</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 

任何想法,将不胜感激。我做了大量的搜索,并尝试了许多不同的配置,没有任何运气。

更新

当试图将实体保存到数据库中,发生的验证错误时的。我收到以下错误:

Caused by: javax.persistence.RollbackException: Error while committing the transaction 
Caused by: javax.validation.ConstraintViolationException: Validation failed for classes 
List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='numeric value out of bounds (<9 digits>.<3 digits> expected)... 
+0

如果您在前端使用Spring表单,请将'@ RequestBody'更改为'@ ModelAttribute'如果可能,请显示前端代码(如何调用此请求) –

+0

这是一个REST端点,所以我只是使用邮差客户端在主体中使用JSON对象进行POST。 – tlavarea

+0

[this](http://blog.codeleak.pl/2013/09/request-body-validation-in-spring-mvc-3.2.html)和[此链接](https://dzone.com/articles/spring-31-valid-requestbody)可能对你有所帮助 –

回答

0

使用@Valid注释应声明BindingResult参数正确验证后POJO。 BindingResult会包含所有的验证错误,你可以随意做任何你想要的事情。

+1

更多上下文:[入门 - 验证表单输入](https://spring.io/guides/gs/validating-form-input/)。入门说明了如何进行表单验证,但您也可以根据JSON请求执行您自己的自定义响应。 –

+0

谢谢你的回应。我已经尝试过,没有任何运气。 BindingResult始终包含零错误。我也尝试创建一个@ContainerAdvice类来全局处理MethodArgumentNotValidException和ConstraintViolationException,但这也没有奏效。 – tlavarea

+0

尝试从您的参数中删除@RequestBody注释,并确保您的类路径中具有javax.validation的实现,例如休眠验证器。 你在哪里放置了BindingResult?这是后验证的param,就像这样:'(@Valid MyPojo pojo,BindingResult错误,@Valid MyAnotherPojo anotherPojo,BindingResult anotherErrors)' –

0

所以事实证明,@BasePathAwareController是什么导致绑定验证不运行。不知道这是预期行为还是错误,但是通过从控制器中删除该注释,验证按预期运行。