2011-06-06 27 views
2

这是对我的问题Spring Web MVC - validate individual request params的后续。在哪里验证网络应用程序中的数据(使用Spring)

我已经想出了如何在从我的输入创建的域对象上调用Spring验证器,以及如何让该验证器对我的类自己颁发JSR-303注释。我无法弄清楚的部分是在我的代码中执行此验证的地方。显而易见的方法是在控制器中执行此操作,并在验证失败时返回不同的模型和视图。

但我也有一个服务层,它有时会从Web控制器以外的输入源中创建/更新对象。所以很容易在那里实现验证,但我认为报告失败的唯一明显方式是抛出异常。我看到Spring提供了BindException,但Javadoc也基本上说不在应用程序代码中使用它。

这里常见的/推荐的做法是什么?

回答

1

当您将验证逻辑封装在ValidationService中时,您可以在控制器和服务中使用它。由于您希望用户与输入交互并纠正无效信息,因此您应该能够在Web视图中显示验证问题。

有时你可能有数据(CommandObjects,Forms),它不能直接在服务层中看到,然后验证应该在控制器中完成,然后控制器将信息传递到服务层。

当你设计你的应用程序时,你应该考虑每一层之间的交互。将验证逻辑混合到每个层可能不是必需的。考虑数据如何进入你的系统。如果控制器是您的主要入口点,那么您可以完全将其放置在那里,因为没有数据在未通过验证的情况下进入服务。

6

我认为答案是两个。

控制器与视图相关联。如果您更改视图技术,您不希望验证消失。

服务应该假设没有人安全并验证所有传入参数。

+0

不够公平。但在那种情况下,是否有一种干净的方式来报告失败? – Dan 2011-06-06 15:07:51

+0

向谁报告?网络用户?控制器这样做。应用服务器?该服务应该在日志或警报或其他内容中执行此操作。我假设这个异常不会传播出控制器。 – duffymo 2011-06-06 15:59:52

0

至少应该在服务层验证输入,以保证正确性。此外,如果需要,您可以进一步进行验证以获得更好的可用性等。

1

其他的答案都是很好的,我只是陈述一个重要的规则:

每个子系统/层应验证其输入,不管它来自何方。

相关问题