【问题标题】:Implement validations in setters or use Hibernate Validator在 setter 中实现验证或使用 Hibernate Validator
【发布时间】:2013-02-04 11:49:36
【问题描述】:

我在 GWT + Hibernate 项目中面临设计决策。

我将使用公司实体来解释我的问题。

@Entity
@Table(name = "Company")
public class Company extends LightEntity implements BaseSerializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id")
    private int id;

    @Column(name = "Code")
    private String code;
    @Column(name = "Name")
    private String name;

    @Column(name = "Address")
    private String address;

    @Column(name = "ContactNumber1")
    private String contactNumber1;

    @Column(name = "ContactNumber2")
    private String contactNumber2;

    @Column(name = "EMail")
    private String email;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company", cascade = CascadeType.ALL)
    private List<CompanyRegistration> companyRegistrations = new ArrayList<CompanyRegistration>();

    public Company() {
    }
    public Company(String code, String name) {
        this.setCode(code);
        this.setName(name);
    }

    // getters & setters
}

有效的公司对象必须始终具有有效的代码和名称。其余属性是可选的。因此,我提供了一个双参数构造函数来确保创建一个有效的对象。

现在。

我习惯于在 setter 中验证数据。我还在构造函数中使用这些设置器。这些确保新对象始终具有有效状态。这是/曾经是我实施 Hibernate 实体的计划。

但是,GWT-RPC 要求使用默认的 noargs 构造函数,以便它可以用于延迟绑定。但这也将允许任何人创建一个空对象,这在我的大多数 Hibernate 实体中是不可取的。例如,必须始终使用代码和名称构建公司。 noargs 构造函数违反了该规则。

现在,Hibernate 已经为验证框架实现了一个标准(JSR-303,如果我没记错的话)。它允许您在已创建的对象上调用验证。

我的问题是由于 noargs 构造函数而出现的。如果它不是强制性的,我会取消 setter 中的验证。

如果我在 setter 中实现验证,这意味着无效对象将尽快失败。我不需要在客户端对对象调用验证。但是,无法以这种方式验证空对象(使用 noargs 构造函数创建)。它可能会进入服务,这意味着我还必须在服务层中实现验证,其中很多可能与设置器相同。

如果我实现了验证框架,那么我必须对我在客户端创建的每个对象调用验证。如果我忘记验证一个,它可能会以无效状态进入服务层。但是,我可以轻松地在服务层使用相同的框架。

我想到的一个解决方案是无论如何都要在 setter 中实现验证,但也要在服务层中使用 Validator,然后再将对象发送到数据库中。这样,客户端将自动受到设置器的限制。另一方面,如果一个空对象被发送到服务器端,它将被服务层的验证器捕获。在这两种情况下都会向用户抛出异常。

但是,我认为这不是最好的解决方案。所以,我想买一个。

编辑 - 无论如何我都在使用注释来对实体字段施加约束,以便 Hibernate 可以在持久化对象之前使用它们进行验证。

【问题讨论】:

    标签: hibernate gwt bean-validation setter hibernate-validator


    【解决方案1】:

    如果您的问题仅源于 GWT-RPC 的强制零参数构造函数,请注意您可以使开发人员无法访问此构造函数(如果您愿意,甚至可以使用 private); GWT-RPC 将使用反射访问它,无论其可见性如何。

    【讨论】:

    • 好吧,天哪!我从来没想过这点。我刚刚将一个默认构造函数设为私有,它起作用了!我想这结束了我的问题。但是,如果这不是唯一的问题,我想知道您实际上更愿意做什么。
    • 我决定在 setter 中实现验证。现在解决了 noargs 构造函数问题,我的应用程序将始终具有对象的有效状态。服务层仍将有一个非空约束作为验证。不过,我也会对实体实现 Hibernate 约束注解,这样如果需要,我可以在服务层使用 Hibernate Validator 进行验证。
    猜你喜欢
    • 2023-04-02
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多