java - 无注释的程序化 Bean 验证 (JSR 303)

标签 java hibernate spring bean-validation

<分区>

Possible Duplicate:
using Hibernate Validator without calling annotation.

我有这个复合约束注释(仅用于说明):

@Target... @Retention...
@Constraint(validatedBy = {})
@Pattern(regexp = PasswordComplexity.AT_LEAST_TWO_NONE_ALPAH_CHARS)
@Length(min = 6, max = 20)
public @interface PasswordComplexity {   
    ...    
}

我在 Spring Controller 和实体类中使用它。

但现在我需要在服务方法中检查单个字符串,我需要在其中对单个字符串应用相同的约束。由于约束相同,我想使用相同的约束定义 (@PasswordComplexity)(单一事实来源)。像这样的东西:

public void createUser(UserDto userDto, String password) {
  if(hasViolation(validator.validate(password,PasswordComplexity.class))) {
   throw new PasswordComplexityViolationException();
  } else {
   …
  }
}

但我不知道如何为未注释的简单对象(字符串)运行 JSR 303 validator 。至少有可能吗?如何实现?

(我使用 Hibernate Validator 作为 JSR 303 提供程序)

最佳答案

实现此目的的一种方法是编写一个完整的自定义 validator ,并将逻辑下推到该类中,让注释只使用 validator 。这意味着您将拥有一个独立的编译单元(一个完整的类 PasswordComplexityValidator implements implements ConstraintValidator<PasswordComplexity, String> ... ),您可以独立于注释使用它。这种方法还可以让您更轻松地对验证进行单元测试。

但是,由于您使用注解作为配置 Hibernate 提供的现有正则表达式 validator 的一种方式,因此您可以改用该 validator ,将注解类中的常量模式传递给它。您还应该能够将您的长度约束也打包到正则表达式中,这比同时使用两个注释更简单、更快。

关于java - 无注释的程序化 Bean 验证 (JSR 303),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6303369/

相关文章:

java - 将javascript json对象转换为Java json对象

spring - 对依赖于@OneToMany 集合的类进行单元测试

java - 如何有条件地启用或禁用 Spring 中的计划作业?

java - Java中的分布式计数信号量

java - 如何使用 Spring TaskExecutor 在应用程序的所有请求中使用单个任务池

java - 一个 WebView 中的多个 URL

java - 在 HQL 中使用 boolean 值

oracle - 违反约束异常 ORA-00001

java - Spring Web 响应式客户端

java - 具有执行程序或多线程环境的 Apache DBCP