首页 > 解决方案 > 将数据库模型类与其验证相关联的模式

问题描述

我目前正在尝试从我们的数据库模型类中删除所有业务逻辑,以便它们只包含字段、getter 和 setter。现在我有点纠结于如何提取验证。

我们的验证相当复杂,每个模型在isValid()被调用时都会自行配置和运行每个验证器。我已经将每个模型的验证提取到它自己的参数化验证类中,其中参数是它验证的对象的类型。

我很难解决的问题是想出一种将模型类与其验证类相关联的简单方法。模型类与验证位于单独的模块中,因为验证专门针对我们如何在应用程序中使用这些模型。这意味着我的一个限制是,无论我想出什么设计,都不能涉及更改模型类本身。

我已经尝试了几种设计,但是现在我将模型类与其验证类相关联,方法是手动将它们作为键值对添加到 a Map,然后使用工厂为传入的对象类型返回正确的验证.它可以工作,但它不是很优雅,我有这种感觉可能有更好的解决方案。

以下是模型和验证类的设置方式:

// Interface for all validation classes.
public interface Validation<T> {

    /**
     * Returns all validation for T.
     */
    Validator<T> getValidator();
}

// Concrete validation implementation.
public class FooValidation implements Validation<Foo> {

    public CompositeValidator<Foo> getValidator(Foo foo) {
        // CompositeValidator is a type of Validator that can contain and run many validators.
        return CompositeValidator.of(
            getFooValidatorA(foo),
            getFooValidatorB(foo),
            getFooValidatorC(foo)
        );
    }

    public Validator<Foo> getFooValidatorA(Foo foo) {
        return new FooValidatorA(foo);
    }

    public Validator<Foo> getFooValidatorB(Foo foo) {
        // Configure and return ValidatorB
    }

    public Validator<Foo> getFooValidatorC(Foo foo) {
        // Configure and return ValidatorC
    }
}

// Model class
public class Foo {
    public Integer id;
    public String name;
    public Bar bar;
    // etc...
}

简而言之,我想要一种直接的方式让应用程序知道如果我需要验证一个Foo对象,它应该知道这FooValidation是我需要的验证类。

标签: javavalidation

解决方案


推荐阅读