应在哪一层执行验证?

我正在编写一个 Web 服务。

通常,输入将是 XML 文档和输出 XML 或 JSON。

该应用程序使用MVC模式,具有不同的层

  • 控制器:接收 XML 并提供响应 (XML/JSON)
  • 服务:业务逻辑、事务
  • DAO:查询数据源(数据库或其他 Web 服务)

我的理解是,基本验证(即:针对XSD的XML)应该尽快在控制器层上完成。

之后,我仍然需要执行额外的验证,其中一些验证是基本的,例如

  • 日期格式必须正确
  • 用户名不能超过X个字符(也许也可以在XSD上执行?

据我所知,在将 XML 解编组到 Java 对象中时,应该进行此类基本验证。这也会发生在控制器层中(尽管验证本身将由Java对象完成,其中XML未编组到其中)

最后,我面对的是更“复杂”的验证示例。

  • 日期不应早于1950年(只是一个随机的例子)
  • 如果值 A 大于 B,则值 C 不应超过 D

这种“复杂”的评估似乎是javax.validation.Validator接口的完美候选者。而且感觉它们应该在控制器层中完成。

问题是

  1. 这种方法是否正确?我是否也应该在其他层验证某些内容?
  2. 我是否在控制器中添加了太多逻辑?我是否应该将一些验证移动到业务逻辑所在的服务层?

答案 1

这种方法是否正确?我是否也应该在其他层验证某些内容?

是的,部分是。验证输入数据的正确性(如日期格式,长度等)似乎是正确的。没有必要把它们推到内层。它们需要预先验证。

根据业务规则,可能会有一些验证,这需要在服务层完成,例如在将用户添加到系统时已经注册了用户名/电子邮件,这将在服务层完成。

我是否在控制器中添加了太多逻辑?我是否应该将一些验证移动到业务逻辑所在的服务层?

从我的角度来看,这不被认为是逻辑。将数据验证到控制器与向其添加业务逻辑不同。您不是在更改/制作数据,而是在检查数据的正确性。

如上所述,一些遵循业务规则的验证需要在服务层中实现。

编辑:当您添加Web服务标签时,想象一下您正在调用Web服务,然后在服务器端,它知道数据的格式不正确。如果之前已经过验证,它可能已经节省了往返行程,服务器时间,网络资源等。


答案 2

推荐