java - 应该在哪一层进行验证?

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

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

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

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

  • Controller :接收 XML 并提供响应(XML/JSON)
  • 服务:业务逻辑、交易
  • DAO:查询数据源(数据库或其他网络服务)

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

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

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

据我所知,在将 XML 解码为 Java 对象时应该进行此类基本验证。这也会发生在 Controller 层(尽管验证本身将由 XML 解码到的 Java 对象完成)

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

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

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

问题是

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

最佳答案

Is this approach correct? Should I also validate something at other layers?

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

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

Am I adding too much logic into controllers? Should I maybe move some validation to the Service layer where the business logic is?

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

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

编辑: 当您添加了网络服务标签时,假设您正在调用网络服务,然后在服务器端发现数据格式不正确。如果更早进行验证,它可能会节省往返行程、服务器时间、网络资源等。

关于java - 应该在哪一层进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16394296/

相关文章:

javascript - 从代码中添加 javascript 会破坏页面上的验证!怎么处理呢?

java - JAX-RS 响应对象将对象字段显示为 NULL 值

java - Axis Webservice 调用有时会失败,access.log 显示内容!

asp.net - 控制哪些 WebMethod 在 WebService 中对外公开

java - 在迭代时或在循环内更改 JTextField 的文本

validation - laravel : sanitize request data before validation

多个文本框的 Javascript 验证

java - Java 中的 DES 实现。无法获取明文

java - 访问旧应用程序时 list 合并失败

java - 需要一些帮助把一些东西从绳子上拿下来