【问题标题】:In which layer should validation be performed?应该在哪一层进行验证?
【发布时间】:2013-04-29 22:41:57
【问题描述】:

我正在编写一个网络服务。

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

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

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

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

在那之后,我还需要进行额外的验证,例如一些这样的验证是基本的,例如

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

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

最后我要面对更多的“复杂”验证示例

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

这种“复杂”的验证似乎是 javax.validation.Validator 接口的完美候选者。而且感觉应该在Controller层完成。

问题是

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

【问题讨论】:

  • 对我来说,您所谓的“复杂”验证听起来更像是业务需要,因此应该放在业务逻辑层。
  • @mawia 好点,感谢上帝我引用了“复杂”这个词:)

标签: java web-services validation model-view-controller


【解决方案1】:

这种方法正确吗?我还应该在其他层验证某些东西吗?

是的,部分。验证输入数据的正确性(如日期格式、长度等)似乎是正确的。无需将它们推送到内层。需要预先对其进行验证。

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

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

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

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

编辑: 当您添加了 web-service 标签时,假设您正在调用一个 web 服务,然后在服务器端,它知道数据格式不正确。如果之前已经过验证,它可能会节省往返、服务器时间、网络资源等。

【讨论】:

  • 假设我需要验证用户名不应超过 15 个字符并且应该是唯一的。 15个字符的限制会发生在控制器中,检查唯一性会发生在服务/业务层吗?
  • @Aquillo 是的,限制控制器内的请求以验证长度等是可行的,而不是继续直到服务层来识别它。因此,数据必须经过初始主要验证阶段才能进入下一个阶段,这是更清洁和有利的方法。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
相关资源
最近更新 更多