空检查不同的层(表示层,中间,数据库)

时间:2009-09-09 02:41:18

标签: spring-mvc

我们的应用程序是使用Spring框架开发的。在所有层(演示文稿,业务,数据库)中检查空状态是否良好?我们的应用程序中的流程是

表单提交 - > jQuery验证器 - >弹簧验证器 - >控制器 - >服务 - >数据库

目前,我们正在验证Validator,Controller和Service层中的null条件参数。在控制器中,仅当参数不为null时才调用服务,而在服务中,如果参数为null,则抛出IllegalArgumentException。

以上是正确的设计吗?是否有任何链接表明这种良好做法?

2 个答案:

答案 0 :(得分:3)

取决于!

  • 首先,弄清楚您需要多少错误处理。问问自己这需要多少公共接口。这是一次性代码吗?更正式和公共的API需要对它们接受和返回的数据更加谨慎,并且更清楚地记录。特定于应用程序的代码通常只会抛出异常 - 任何异常 - 当出现问题时。选择适当级别的错误检查。 (答案可能在应用程序的不同层或不同模块中有所不同。)

  • 你的jQuery验证器不应该真正处理空值,但应该检测空字符串(显然)。

  • 我建议确保Spring验证器是您应用程序的强大“防火墙”。我会在这里进行相当严格的空值检查,因为这样可以消除控制器代码的负担。

  • 如果您有合适的验证器,您可以编写更薄的控制器,也许根本不进行验证。实际上不需要在验证器中已有的控制器中进行冗余检查。这些是架构相同的层。

  • 虽然验证器中有检查,但很可能会以不同的方式从不同的控制器调用服务层。我认为值得保持一定程度的保护,以保持数据库的完整性。非常重要的是,如果调用不正确,此代码不会更改数据库或静默进行;像这样的错误特别讨厌追踪。当调用者传递坏(和null)值时,代码应抛出异常 - 任何异常。当然,IllegalArgumentExceptions或NPE可能是正确的,实际上任何异常都可以解决问题,并允许开发人员追踪问题。同样,如果您正在开发公共API,则需要更加严格。

  • 如果数据库缺少某些信息,您应该在服务层界面中定义应该发生什么。 Hibernate有时会返回null,并根据调用抛出异常。遵循它建立的模式是有道理的。

答案 1 :(得分:1)

是否可以在不通过控制器的情况下调用服务?

如果没有,并且控制器中的所有参数都已检查为null,那么在服务中检查它是没有意义的。

但是,如果有办法让某些东西直接进入服务,那么你需要检查。