【问题标题】:Where to validate data in a web app (using Spring)在 Web 应用程序中验证数据的位置(使用 Spring)
【发布时间】:2011-09-09 08:37:57
【问题描述】:

这是我的问题Spring Web MVC - validate individual request params 的后续。

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

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

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

【问题讨论】:

    标签: java spring validation spring-mvc


    【解决方案1】:

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

    每个子系统/层都应验证其输入,无论其来自何处。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          我认为答案是两者兼而有之。

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

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

          【讨论】:

          • 很公平。但是在那种情况下,有没有一种干净的方法来报告失败?
          • 向谁报告?网络用户?控制器这样做。应用服务器?该服务应该在日志或警报或其他内容中执行此操作。我假设异常不会传播到控制器之外。
          猜你喜欢
          • 2012-02-08
          • 1970-01-01
          • 1970-01-01
          • 2016-12-23
          • 1970-01-01
          • 2012-07-04
          • 2015-11-11
          • 2014-05-08
          • 1970-01-01
          相关资源
          最近更新 更多