Playframework 2.0 我应该通过JSR303/Bean验证处理多少逻辑?

Playframework 2.0 我应该通过JSR303/Bean验证处理多少逻辑?,playframework-2.0,bean-validation,Playframework 2.0,Bean Validation,我有一个Play 2.0.1应用程序,我刚刚通过spring数据绑定器了解了表单处理的诀窍。我得到了一个表单,假设一个用户向另一个用户发送消息,看起来像这样: public class MessageForm { @NotNull @NotEmpty public String message; @NotNull public User recipient; // i know, no sender } 我的自定义绑定器确保用户(在HTML表单中由其id表示)正确序列

我有一个Play 2.0.1应用程序,我刚刚通过spring数据绑定器了解了表单处理的诀窍。我得到了一个表单,假设一个用户向另一个用户发送消息,看起来像这样:

public class MessageForm {

  @NotNull @NotEmpty
  public String message;

  @NotNull
  public User recipient;

  // i know, no sender
}
我的自定义绑定器确保用户(在HTML表单中由其id表示)正确序列化,并且在不存在此类用户时默认为null

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


我知道怎么做,我的问题是:这是个好主意吗?从模块的角度来看,这将是一个某种程度上植根于web上下文的约束,因此我不想将其放在我的模型包中。我有一种模糊的感觉,这可能不是JSR的目的,但我也认为这将大大减少控制器中的逻辑,并允许我在用户提交时重用类似的约束。

这是常见的问题。另一种类似的情况是验证,它必须与数据库通信

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

折衷的办法是,将验证与代码的其余部分很好地分开,而不是使用混合了各种应用程序层的验证器

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

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

可能有一个模型和各种验证程序集—注释只是配置。有时,如果模型将用于各种产品中,最好完全放弃注释,使用基于XML的配置(它非常容易理解和使用)

所以不要把验证器放在模型包中,若你们想这样做的话,为你们的验证器创建一个新的包