Ser*_*sky 6 java validation rest spring spring-mvc
应该在Spring Boot Rest API中使用哪个层进行验证.我有一些模型,端点和DTO.我在DTO中添加了一些@NotNull和@Size注释.我@Valid在端点中添加了注释以及@RequestParam注释.
但现在我想知道我是否应该在@Entity课堂上进行验证?我觉得这将是一个重复的代码.但我读到一层不应该依赖另一层.
Nar*_*ros 10
具有讽刺意味的是,有多少人真正相信验证应该是我们在控制器中所参与的事情,或者是他们与业务代码交换的价值对象,如果有关于状态验证的话,其他任何地方都不应该.
我们应该始终努力在任何应用的多个阶段执行验证.
暂时考虑一个控制器,它接受您打算用来更改某个服务中的业务实体的值对象,并且该值对象仅包含您打算在更大的实体中操作的字段子集.验证表示层中的值对象,并将其传递给提取实体的服务,从值对象中获取值并将其设置在适当的实体上.也许该服务方法也操纵其他字段.
我们有什么保证该实体的状态是有效的?
虽然我们验证了值对象是有效的,但我们只在提供的字段子集的上下文中验证了那些输入.我们没有验证这些值与实体的其他现有状态一起仍然有效.
尝试防范开发人员错误也很重要.测试用例只能让你到目前为止,我们都同意我们不会在测试中验证每个值组合的有效性.我们经常针对非常具体的案例和情景,并从那里得出结论.
通过不仅将验证应用于我们的表示值对象而且还应用于我们的实体,您不仅可以让测试用例专注于广泛的功能验证,还可以保证您的数据存储状态永远不会受到应用程序的影响.
考虑了一段时间后,我决定最好的方法是在两个层上都进行验证。我会解释为什么。
想象一下,您有一个User带有name字段的实体,并且您的应用程序业务逻辑要求它不能为空。你也有一个UserDTO相同的name领域。
我假设您对实体和 DTO 的所有验证都将使用java.validationAPI 进行。
如果您仅在控制器上进行验证,那么您可以安全地避免持久化无效实体,但只能来自传入请求。如果您有一个操作实体的服务,它可能会在您不注意的情况下将实体保持在无效状态(除非对数据库列进行空检查)。
然后,您可以想:“好的,我会将验证注释从 DTO 移至实体,一切都会好起来的”。嗯,是和不是!
如果您仅在实体上进行验证,您将不会受到传入请求和服务层的影响,但是您可能会遇到性能问题。
根据Anghel Leonard在其Spring Boot Persistence Best Practices一书中的说法,每次从数据库加载实体时,Hibernate 都会浪费内存和 CPU 来维护持久化上下文中的实体状态,即使实体处于“只读模式”。
现在,想一想。如果用户名为空并且您仅在实体上对其进行验证,这意味着您:
其中许多操作可能很昂贵,而您所做的一切只是为了将其扔进垃圾箱,而如果您早些时候验证了用户名,那么您根本就不会做任何事情。
所以,我的建议是在两个层上都进行验证。注释使它变得如此简单,您甚至没有理由不这样做。即使是复杂的验证也可以编写自定义验证器,然后可以在许多其他地方重用
另外,这里是我提到的那本书的链接,希望你喜欢:https : //www.amazon.com.br/dp/B087WS81RK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
| 归档时间: |
|
| 查看次数: |
3039 次 |
| 最近记录: |