当前位置: 首页 > 知识库问答 >
问题:

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

盖昊东
2023-03-14

我有一个Play 2.0.1应用程序,正在通过spring data binder掌握表单处理的窍门,如文档中所述。我有一个表单,假设一个用户给另一个用户发送消息,看起来像这样:

public class MessageForm {

  @NotNull @NotEmpty
  public String message;

  @NotNull
  public User recipient;

  // i know, no sender
}

我的自定义绑定器确保用户(由他的id以超文本标记语言-form表示)得到正确的序列化,并且当不存在这样的用户时默认为空。

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

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

共有1个答案

明松
2023-03-14

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

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

权衡是在将验证与代码的其余部分很好地分开与混合各种应用程序层的验证器之间进行权衡。

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

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

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

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

 类似资料:
  • 我想从我的应用程序中提取DTO以将它们作为jar提供给层应用程序。 但我使用了Bean验证,所以DTO使用自定义约束进行注释。这种自定义注释对验证实现具有依赖性(链接)。 因此,我的DTO模块依赖于注释,而注释依赖于验证器,验证器依赖于DAO,然后是完整的核心应用程序。 有没有办法打破这种依赖循环?提供DTO jar而不依赖(或只提供bean验证API)的良好实践是什么? 谢谢

  • 我按照这个教程https://spring framework . guru/spring-boot-restful-API-documentation-with-swagger-2/生成了一个swagger文档。它可以工作,但是当我试图在bean中添加一些验证时,我在文档中找不到信息: 带有验证注释的我的实体: 这里,https://github.com/springfox/springfox/

  • 我们决定不使用JSR303,因为它将域对象与基础结构耦合起来,并且需要外部干预来启动验证。 但是当我们开始实现RESTendpoint时,我们再次面临验证问题,因为json转换器不使用类构造函数,而是通过反射注入值。 通过JSR303和Jersey的注释验证对象非常容易,但是需要用JSR303注释域对象。我们有一些选择: null 你对此有什么看法?将JSR303和手动验证混合在一起是一种好方法吗

  • 关于编译器(GCC)所做的优化,标准做法是什么?每个选项(-O、-O1、-O2、-O3、-Os、-s、-fexpensive-optimizations)有什么不同,我如何决定什么是最优的?

  • JSR303Bean验证包含一些现成的约束,但也允许定义自定义约束。 我有一种感觉,对于许多没有随JSR实现一起提供的项目来说,有很多共同的约束。 日期范围 密码复杂性检查 等于交叉字段验证(堆栈溢出投票最高的'bean验证'问题) ... 所以我的问题是:是否有一个(值得信赖的)库包含commons jsr 303(Bean验证)约束?

  • 我缺少一些真正基本的东西(与EAR或EAR配置中的类加载相关)。我不明白,为什么我的JSR303验证和Hibernate验证不是从EAR内部触发的...如果我创建一个新的战争项目,它就会触发。 我正在Weblogic Server10.3上用Maven、JSF2.0、Open-JPA、EJB3.0建立一个新项目。我使用maven原型创建了所有项目。我有一个最终的EAR构建,它的结构如下: 项目名称