2009-09-09 89 views
1

我们的应用程序是使用Spring框架开发的。检查所有图层(演示文稿,业务,数据库)中的空白条件是否是一种好的做法?在我们的应用程序的流程是不同层次的检查(表示层,中间层,数据库)

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

目前,我们正在检查这两个校验器,控制器和服务层的空状态的参数。在控制器中,服务仅在参数不为null时调用,而在服务中如果参数为null,则抛出IllegalArgumentException。

上述设计是否正确?是否有任何暗示这种良好做法的链接?

+0

退房比尔·瓦格纳的书更有效的C# - 它有上限制了可空类型的“范围”一节。他比我说得更好。 – TrueWill 2009-09-09 02:51:28

回答

3

这要看!

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

  • 您的jQuery验证程序不应该处理空值,但应该检测空字符串(显然)。

  • 我会推荐确保Spring验证器对您的应用程序是一个强大的“防火墙”。我会在这里做相当严格的空检查,因为这可以消除控制器代码的负担。

  • 如果你有很好的验证器,你可以编写更细的控制器,也许根本不需要验证。实际上不需要在验证器中已有的控制器中进行冗余检查。这些在体系结构上是相同的层。

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

  • 如果数据库缺少一些信息,您应该在服务层接口中定义应该发生什么。 Hibernate有时会返回空值,并根据调用情况抛出异常。遵循它建立的模式是有意义的。

1

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

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

但是,如果有某种方式直接进入服务,那么您需要检查。