2013-08-20 15 views
2

我有两个@Entity bean。豆一个是“一对多”的第二个。 Bean1和Bean2具有JSR303不同的注释验证器。如何处理来自内部@Entity类的Spring BindingResult异常在持久化之前使用Hibernate进行验证

@Entity 
class Bean1 { 
    @OneToMany 
    private List<Bean2> var; 

    //other fields marked with JSR303 
} 

@Entity 
class Bean2 { 
    //other fields marked with JSR303 
} 

我的任务是验证内部Bean2。所有的 首先我控制器,Bean1

的@Validated
@Controller 
class Controller { 
    public String methodPOST(@Validated Bean1 bean1, BindingResult errors) 
} 

Hibernate试图去持续到数据库之前会自动验证JSR303。所以,我甚至没有任何来自Bean2的验证异常,因为Spring不处理它们,而Hibernate则抛出它。

我可以创建类似DTO bean的东西,并验证它们,如果标记@Valid,内部Bean2DTO将被验证,并且不会从Hibernate方面抛出异常,因为在持久化之前没有验证。同样在这种情况下,我将在Controller方法中填充BindingResult。

是否有一些解决方案可以从Hibernate org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(..)中将javax.validation.ConstraintViolationException引发到BindingResult中,而不需要上述两个选项。

此外,我不能禁用Hibernate自动验证之前的持久性,由于腐败其他量的逻辑。

谢谢。

回答

2

可能的复制,可以发现here

总括来说,你需要@Valid

@Entity 
class Bean1 { 
    @OneToMany 
    @Valid 
    private List<Bean2> var; 

    //other fields marked with JSR303 
} 

@Entity 
class Bean2 { 
    //other fields marked with JSR303 
} 

这也将引发春季嵌套验证来注释嵌套属性(假设也有一个JSR -303验证器配置)。

+0

无论有没有有效的注释都没有关系,因为hibernate在持久化之前总是会验证,它会抛出与我上面描述的相同的异常,并且有效或没有它。 –

+0

我发现了问题,我有。我使用指定的组验证了注释,并且有效注释不起作用,因为还验证了在验证中指定的组。非常感谢您的建议! –

相关问题