我正在编写一个网络服务。
通常输入是 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 层中完成。
问题是
- 这种方法是否正确?我还应该在其他层验证一些东西吗?
- 我是否在 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/