Spring Hibernate验证@RequestBody

时间:2016-09-20 02:40:27

标签: spring hibernate validation spring-boot

使用Spring Boot 1.4和Spring Data Rest / MVC我无法让@Valid @RequestBody正常工作。我已经尝试了多个版本的Hibernate Validator,声明了Validtor bean等等。没有运气。

@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方法但Spring没有尝试对pojo进行任何验证时,我实际上看到了验证器异常。

以下是我的POM部分,包括spring依赖项:

        <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)...

2 个答案:

答案 0 :(得分:0)

使用@Valid注释,您应该在验证pojo之后立即声明BindingResult参数。 BindingResult将包含所有验证错误,您可以随心所欲地执行任何操作。

答案 1 :(得分:0)

事实证明@BasePathAwareController是导致绑定验证无法运行的原因。不确定这是预期的行为还是错误,但是通过从我的控制器中删除该注释,验证将按预期运行。