如何在没有框架的情况下通过 hibernate-validation 使用 Java Beans 验证?

How to use Java Beans validation through hibernate-validation without a framework?

我在 JavaFX 应用程序上通过 hibernate-validation 使用 Java Beans 验证,因此,没有框架来帮助连接。我将这些依赖项添加到我的项目中:

compile group: "org.hibernate", name: "hibernate-validator", version: "6.0.2.Final"
compile group: "org.glassfish", name: "javax.el", version: "3.0.1-b08"
compile group: "javax.validation", name: "validation-api", version: "2.0.0.Final"

我发现这可以让 modelObject 得到验证:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
validator.validate(modelObject);

我的问题是,每次验证时都创建一个新的工厂和验证器是不是不好?我应该将它们缓存在某个地方并重新使用它们吗?验证器的成本和多线程程度如何?

每次都新建ValidatorFactory不好吗?

根据javadoc注释,说明如下:

  • The ValidatorFactory object built by the bootstrap process should be cached and shared amongst Validator consumers.
  • This class is thread-safe.

Validator 起,根据 javadoc

,其实现也有望成为 线程安全

在 Spring

中与 javax.Validation 合作

您已使用 'Spring' 标记您的问题,因此请注意如何正确使用 javax.validation + Spring。

首先,使用 Spring LocalValidatorFactoryBean(例如回答 here),这将处理您正在寻找的必要缓存:

@Bean
public javax.validation.Validator localValidatorFactoryBean() {
   return new LocalValidatorFactoryBean();
}

其次,也使用 Spring 注入 Validator 实例:

@Autowired
private Validator validator;

您可以让 Spring 完成所有工作。例如,要使与验证相关的注释适用于方法,请定义

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor();
}

在您的 Spring 应用程序配置中,然后您就可以调用

public void myMethod(@Valid MyValidationAnnotatedType parameter){
    ...
}

public void anotherMethod(@Pattern(regex = "^[A-Za-z]+$") stringParameter) {
    ...
} 

详情请参考Spring documentation