标签: hibernate-validator

Spring MVC + Hibernate:数据验证策略

我们都知道,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)

你能提供更优化的方法吗?

java validation spring-mvc hibernate-validator

22
推荐指数
1
解决办法
1万
查看次数

Hibernate Validator - @Length - 如何为min和max指定单独的消息?

我在我的网络应用程序中使用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但他们没有做我想做的事.任何投入将不胜感激!

java hibernate-validator bean-validation

18
推荐指数
3
解决办法
4万
查看次数

由于Bean Validation API导致无法启动Hibernate Validator

我正在尝试在我的项目中使用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)

但它似乎没有任何影响.

java hibernate hibernate-validator maven

18
推荐指数
2
解决办法
4万
查看次数


hibernate唯一密钥验证

比方说,我有一个字段,user_name在表格中应该是唯一的.

使用Spring/Hibernate验证验证它的最佳方法是什么?

java spring hibernate hibernate-validator bean-validation

17
推荐指数
3
解决办法
2万
查看次数

有什么替代 Hibernate Validator 的 @SafeHtml 来验证字符串?

正如 JavaDocs 中所述,它将在未来版本中删除。是否有任何替代库可以通过注释类似地工作?

java hibernate-validator

17
推荐指数
2
解决办法
3275
查看次数

在@Constraint中清空validatedBy

我注意到所有内置约束都具有validatedBy参数的空值@Constraint.即@Constraint(validatedBy = {})

首先,为什么他们允许空值validatedBy?我认为你可以将它留空仅用于不需要附加验证的约束组合?

另外,请注意Hibernate Validator仍然可以为每个内置约束找到一个验证器实现类,尽管它validatedBy是空的,但如果我将validatedBy留给我的约束,我的自定义验证器永远不会被拾取.这是为什么?

谢谢.

java hibernate-validator bean-validation

16
推荐指数
2
解决办法
4285
查看次数

如何使用Hibernate Validator动态解析消息参数?

我正在使用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)时,我得到了我期望的错误数,除非它们是相同的字符串.我希望看到每个消息中的类别名称已解析.有人能指出我如何动态解决参数,或告诉我如何?

java validation spring hibernate hibernate-validator

16
推荐指数
1
解决办法
1万
查看次数

Java中正则表达式的重音

我想使用Hibernate Validator来验证一些列.据我所知,问题是java中的\ w标记不接受带有重音符号的字母.

有没有什么方法可以编写正则表达式,以便像Relatório这样的单词可以被验证(我不想写括号之间带有重音的所有字母,因为我希望在很多列中写这个正则表达式)?

java regex hibernate-validator

16
推荐指数
2
解决办法
1万
查看次数

如何用hibernate验证数字字符串为数字?

我必须使用哪些注释来进行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 hibernate-validator

15
推荐指数
2
解决办法
2万
查看次数