我们都知道,Spring MVC通常与Hibernate Validator和JSR-303很好地集成.但正如有人所说,Hibernate Validator只适用于Bean Validation,这意味着应该将更复杂的验证推送到数据层.此类验证的示例:业务密钥唯一性,内部记录依赖性(通常指向数据库设计问题,但我们都生活在一个不完美的世界).即使像字符串字段长度这样的简单验证也可能由某个DB值驱动,这使得Hibernate Validator无法使用.
所以我的问题是,Spring或Hibernate或JSR是否提供了执行此类复杂验证的功能?是否有一些已建立的模式或技术部分可以在基于Spring和Hibernate的标准Controller-Service-Repository设置中执行此类验证?
更新:让我更具体一点.例如,有一个表单向控制器的save方法发送AJAX保存请求.如果出现一些验证错误 - 简单或"复杂" - 我们应该回到浏览器,其中一些json指示有问题的字段和相关错误.对于简单错误,我可以从中提取字段(如果有)和错误消息BindingResult.您会针对"复杂"错误提出什么样的基础设施(可能是特定的,而不是临时的例外?)?使用异常处理程序对我来说似乎不是一个好主意,因为在save方法之间分离单个验证过程@ExceptionHandler并使事情变得复杂.目前我使用一些特殊的例外(如,ValidationException):
public @ResponseBody Result save(@Valid Entity entity, BindingResult errors) {
Result r = new Result();
if (errors.hasErrors()) {
r.setStatus(Result.VALIDATION_ERROR);
// ...
} else {
try {
dao.save(entity);
r.setStatus(Result.SUCCESS);
} except (ValidationException e) {
r.setStatus(Result.VALIDATION_ERROR);
r.setText(e.getMessage());
}
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
你能提供更优化的方法吗?
我在我的网络应用程序中使用Hibernate验证器进行表单验证.我在我的String属性中使用@Length注释,如下所示:
@Length(min = 5, message = "The field must be at least 5 characters")
private String myString;
Run Code Online (Sandbox Code Playgroud)
但是,如果String超过50个字符,我需要显示不同的消息.有没有办法使用开箱即用的@Length验证器来做到这一点?我想做的一个例子(编译器不会让我)如下:
@Length(min = 5, message = "The field must be at least 5 characters")
@Length(max = 50, message = "The field must be less than 50 characters")
private String myString;
Run Code Online (Sandbox Code Playgroud)
我试过@Max和@Min但他们没有做我想做的事.任何投入将不胜感激!
我正在尝试在我的项目中使用Hibernate Validator,但它无法正常工作.在以下行:
SessionFactory sessions = config.buildSessionFactory(builder.build());
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
org.hibernate.cfg.beanvalidation.IntegrationException: Error activating Bean Validation integration
at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:154)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:311)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1857)
at net.myProject.server.util.HibernateUtil.<clinit>(HibernateUtil.java:32)
... 36 more
Caused by: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider;
at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:119)
at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:45)
at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:217)
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)
Run Code Online (Sandbox Code Playgroud)
我发现这个问题与我的问题非常相似.他将他的解决方案描述为
我在类路径中有另一个bean验证器jar.但不是来自maven,所以我没有意识到这一点.删除它解决了问题.
我认为我的问题是一样的.在http://hibernate.org/validator/documentation/getting-started/上它说:
这种传递性依赖于Bean Validation API(javax.validation:validation-api:1.1.0.Final)
这必定会导致此问题,因为恢复到旧版本(4.3.1.Final)可以解决问题.有没有办法强制Hibernate不引入Bean Validation API?
编辑:我试图排除javax验证api:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.3.Final</version>
<exclusions>
<exclusion>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但它似乎没有任何影响.
我正在尝试添加约束检查,如下所述如何在EclipseLink/JPA中指定@OneToMany的基数
比方说,我有一个字段,user_name在表格中应该是唯一的.
使用Spring/Hibernate验证验证它的最佳方法是什么?
正如 JavaDocs 中所述,它将在未来版本中删除。是否有任何替代库可以通过注释类似地工作?
我注意到所有内置约束都具有validatedBy参数的空值@Constraint.即@Constraint(validatedBy = {})
首先,为什么他们允许空值validatedBy?我认为你可以将它留空仅用于不需要附加验证的约束组合?
另外,请注意Hibernate Validator仍然可以为每个内置约束找到一个验证器实现类,尽管它validatedBy是空的,但如果我将validatedBy留给我的约束,我的自定义验证器永远不会被拾取.这是为什么?
谢谢.
我正在使用Hibernate Validator,并希望在错误消息中解析类别的名称.考虑这个简单的场景:
public class Category {
private String name;
}
public class Product {
@HazardousCategoryConstraint(message = "{haz.cat.error}")
private Category category;
private String name;
}
public class InventoryReport {
@Valid
private List<Product> products;
}
ValidationMessages.properties
haz.cat.error={name} is a product in the hazardous category list.
Run Code Online (Sandbox Code Playgroud)
假设我有一个HazardousCategoryConstraint的工作实现.验证器根据受限制的名称列表检查每个类别的名称.当我调用validate(InventoryReport)时,我得到了我期望的错误数,除非它们是相同的字符串.我希望看到每个消息中的类别名称已解析.有人能指出我如何动态解决参数,或告诉我如何?
我想使用Hibernate Validator来验证一些列.据我所知,问题是java中的\ w标记不接受带有重音符号的字母.
有没有什么方法可以编写正则表达式,以便像Relatório这样的单词可以被验证(我不想写括号之间带有重音的所有字母,因为我希望在很多列中写这个正则表达式)?
我必须使用哪些注释来进行Hibernate验证,以验证要应用于以下内容的String:
//should always have trimmed length = 6, only digits, only positive number
@NotEmpty
@Size(min = 6, max = 6)
public String getNumber {
return number.trim();
}
Run Code Online (Sandbox Code Playgroud)
如何应用数字验证?我会@Digits(fraction = 0, integer = 6)在这里使用吗?
java ×9
hibernate ×3
spring ×2
validation ×2
eclipselink ×1
java-ee ×1
jpa ×1
maven ×1
regex ×1
spring-mvc ×1