应该在哪个层进行验证?

Jua*_*ano 12 java validation model-view-controller web-services

我正在写一个网络服务.

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

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

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

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

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

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

据我所知,在将XML解组为Java对象时,应该进行这样的基本验证.这也会发生在控制器层中(尽管验证本身将由解组XML的Java对象完成)

最后,我面对更复杂的验证示例

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

这种"复杂"的值似乎是javax.validation.Validator接口的完美候选者.并且感觉它们应该在Controller层中完成.

问题是

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

Nay*_*kar 5

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

是的,部分.验证输入数据的正确性如日期格式,长度等似乎是正确的.不需要将它们推送到内层.他们需要提前验证.

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

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

从我的角度来看,它不被视为逻辑.将数据验证到控制器不同于向其添加业务逻辑.您不是在改变/处理数据,而是检查数据的正确性.

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

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

  • @Aquillo是的,在控制器内限制请求以确认长度等是可行的,而不是继续直到服务层识别它.因此,数据必须经过初始的主要验证阶段才能进入下一个阶段,这是更清洁和有利的方法. (2认同)