我应该通过JSR 303 / Bean验证处理多少逻辑?

时间:2012-06-12 21:02:10

标签: playframework-2.0 bean-validation

我有一个Play 2.0.1应用程序,我只是通过spring数据绑定器获取表单处理的挂起,如described in the documentation。我得到了一个表格,让我们说用户向另一个用户发送消息,看起来像这样:

public class MessageForm {

  @NotNull @NotEmpty
  public String message;

  @NotNull
  public User recipient;

  // i know, no sender
}

我的自定义绑定程序确保用户(由HTML表单中的id表示)被正确序列化,并且在没有此类用户时将默认为null。

我正在考虑编写额外的验证,即i.E。确保用户通过表单传递的是用户试图发布消息的朋友。这基本上是一种@FriendsWithCurrentUser - 注释。

我知道如何做到这一点,我的问题是:这是一个好主意吗?从模块的角度来看,这将是一个有点根植于Web上下文的约束,所以我不想把它放在我的models-Package中。我有一种模糊的感觉,这可能不是JSR的意思,但我也认为这会大大减少我的控制器中的逻辑,并允许我在用户提交上重用类似的约束。

1 个答案:

答案 0 :(得分:1)

这是常见问题。另一个类似的例子是必须与数据库通信的验证。

从我的观点来看,问题是你多久会使用一次验证?如果它将在20个地方使用,我会编写注释+验证器类,但如果在一两个地方使用此验证,最好手动抛出ConstraintViolationException。然后我们仍然使用通用的验证机制,但我们不需要编写有问题的验证器类。有时这也是性能问题:我们只是为了验证而查询数据库,而且经常在业务逻辑中重复查询。

权衡是在与其他代码进行良好分离的验证与将各种应用程序层混合的验证器之间进行权衡。

通常我更喜欢编写单独的验证,因为经常发生必须在其他地方使用相同的验证。如果没有单独的验证器,我经常复制现有的验证代码,因为总是有一些更重要的事情需要重构验证...

Bean Validation的想法是在应用程序中有单独的层,负责验证。该层不应与Model混合,因为给定的Model可以通过许多不同的方式进行验证。

可能有一个模型和各种验证器 - 注释只是配置。有时候,如果要在各种产品中使用Model,最好放弃注释并使用基于XML的配置(理解和使用起来非常容易)。

所以不要在模型包中放置验证器,为验证器创建一个新包,如果你想这样做的话。