Java 模式将数据库模型类与其验证关联

Java 模式将数据库模型类与其验证关联,java,validation,Java,Validation,我目前正在尝试从数据库模型类中删除所有业务逻辑,以便它们只包含字段、getter和setter。现在我对如何提取验证有点困惑 我们的验证相当复杂,当调用isValid()时,每个模型都会自行配置和运行每个验证器。我已经将每个模型的验证提取到它自己的参数化验证类中,其中参数是它验证的对象的类型 我一直很难解决的问题是找到一种简单的方法将模型类与其验证类关联起来。模型类与验证在一个单独的模块中,因为验证专门针对我们在应用程序中如何使用这些模型。这意味着我的一个限制是,无论我提出什么设计,它都不能涉及

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

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

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

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

以下是如何设置模型和验证类:

// 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...
}
//所有验证类的接口。
公共接口验证{
/**
*返回T的所有验证。
*/
验证器getValidator();
}
//具体的验证实施。
公共类验证实现验证{
公共复合器getValidator(Foo-Foo){
//CompositeValidator是一种类型的验证器,可以包含并运行许多验证器。
返回复合Evalidator.of(
GetFooa(foo),
GETFOOB(foo),
getFooValidatorC(foo)
);
}
公共验证器getFooValidator(Foo-Foo){
返回新的fooa(foo);
}
公共验证器getFooValidatorB(Foo-Foo){
//配置并返回验证器B
}
公共验证器getFooValidator(Foo-Foo){
//配置并返回Validator C
}
}
//模范班
公开课Foo{
公共整数id;
公共字符串名称;
公共酒吧;
//等等。。。
}

简而言之,我想让应用程序知道,如果我需要验证
Foo
对象,它应该知道,
foovalization
是我需要的验证类。

关于您已经考虑和/或尝试过的其他设计的任何提示?我尝试实现的另一个想法是创建一个自定义注释,我可以用它可以验证的模型类来标记每个验证类。这样做的最大优点是,我可以使用反射自动构建所有模型->验证程序类关系,并像上面那样将它们存储在映射中。缺点是编译时没有类型安全性,因为我不知道如何防止验证器被错误地注释。