模型约束验证

时间:2011-08-16 07:56:15

标签: java validation model constraints

给定基于通用树的(Java)数据模型。我们说

abstract class XModel {
  long id;
  XModel parent;
}

class ProjectModel extends XModel {
  String customer;
}

class FileModel extends XModel {
  String name;
}

class FolderModel extends XModel {
  String name;
  String attributes;
}

我的挑战是确保FileModel仅用于FolderModels(或PrjectModels),而FolderModels仅用于ProjectModels。 由于模型应该是可扩展的 - 是否有任何通用的方法来执行此约束验证(如XML Schema所做的那样),而无需在验证方法中对父子项进行硬编码?

3 个答案:

答案 0 :(得分:1)

我不确定它有多么有用 - 取决于你如何创建树,但这可能有效:

abstract class XModel<T extends XModel> {
    long id;
    T parent;
}

class ProjectModel extends XModel { ... }

class FolderModel extends XModel<ProjectModel> { ... }

class FileModel extends XModel<FolderModel> { ... }

更新

要将验证逻辑与模型本身分开,您可以使用一些运行时验证程序,如HibernateSpring验证程序。

答案 1 :(得分:0)

如果您不想将这些约束放入代码中,则必须自己编写一些由某些外部数据提供的验证方法。 AFAIK除了使用Generics之外,没有这样的内置选项(在编译器中),这需要你在代码中表达约束。

答案 2 :(得分:0)

我会使用描述限制的泛型和接口

  interface Model {

  }

  abstract class AbstractModel<P extends Model> implements Model {

    Long id;
    P    parent;
  }

  class ProjectModel extends AbstractModel implements HasFileModel,
      HasFolderModel {

  }

  interface HasFileModel extends Model {
  }

  static class FileModel extends AbstractModel<HasFileModel> {

  }

  interface HasFolderModel extends Model {

  }

  class FolderModel extends AbstractModel<HasFolderModel> implements
      HasFileModel {

  }

这样,子进程只将父进程限制为接口而不是具体类型