spring 服务层和控制器:谁负责什么

kokeuurv  于 2023-08-02  发布在  Spring
关注(0)|答案(2)|浏览(84)

在课堂上,我们正在学习如何构建Spring应用程序,尽管spring并没有直接涉及,但我们学习了如何为DAO和服务层对象创建接口。
如果我错了,请纠正我:DAO层非常抽象:它只包含CRUD操作,并进一步用于读取数据。(即:获取所有对象、获取特定对象等)
服务层:包含创建和删除内容的服务,这是业务逻辑应该在的地方。
现在所有这些在服务层都有意义了;除了“更新”对象。你只是把一个“更新”功能,只是保存在您的数据库中的对象?或者你也需要定义那里的逻辑吗?这就是我的困惑所在,因为我的理解是Spring中的对象只是POJO。那么谁来验证数据呢?
假设我有一个Object“child”,它有:NameSurNameGenderPhotoBirthdate字段。我该如何命名这些服务?或者让控制器来处理验证,这对我来说似乎不太正确。另一方面,将需要调用的每个setter都委托给服务层似乎也不正确。
所以基本上:帮助我了解如何定义通过服务层保存对象。

4ktjp1zp

4ktjp1zp1#

Spring服务通常是事务性的。事物进入特定的服务方法,因为它们应该在同一事务中被组合在一起。如果你想从数据库中检索一个对象,修改它,然后保存新的版本,那么检索和保存应该在同一个服务方法中。因此,您的服务方法是根据您需要应用程序为用户做什么来确定的。
我试图限制控制器做与验证http参数相关的工作,决定用什么参数调用什么服务方法,在httpsession或请求中放入什么,重定向或转发到什么视图,或者类似的web相关的事情。
至于验证:在控制器中验证输入参数是一件好事,可以确保没有人可以用虚假输入破坏应用程序。控制器中的验证往往是关于确保输入在语法上是正确的(包括检测注入攻击),而服务级验证是关于确保数据库中的事物状态是您期望的。
因此,控制器包含Web框架基础架构代码,服务包含应用程序逻辑代码。

tvokkenx

tvokkenx2#

如果你希望控制器能够持久化Child对象的更改,那么传统上你会在服务中使用一个名为ChildService.update(Child newchild)的方法,它将处理调用正确的DAO来持久化这个Child的新版本。
控制器可以自由地向服务请求一个Child,更改周围的字段(可以想象,基于一些用户输入)--一个合理的设计是让控制器对Child POJO做一些工作,然后要求服务持久化更改。模型POJO应该不知道控制器、服务或DAO,而只是简单地按照您的建议保存数据--当然,您不希望每次对setName()setGender()的调用都自动导致数据库更新。
相反,控制器和/或服务应该获取一个Child对象,在其工作单元中对该对象执行所需的任何工作,然后请求服务(然后是DAO)持久化更改。
验证可以在多个层中进行-控制器可能希望验证来自Web用户的任何输入,并且服务可能希望在持久化之前验证它是否具有有效的Child对象。在两个层中都有一定程度的验证特别有意义,以防您希望在其他功能中重用此服务-例如公开REST接口,不同的前端等。

相关问题