Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该在MVC层和服务层中复制验证吗?_Java_Spring_Validation_Stripes - Fatal编程技术网

Java 我应该在MVC层和服务层中复制验证吗?

Java 我应该在MVC层和服务层中复制验证吗?,java,spring,validation,stripes,Java,Spring,Validation,Stripes,我现在觉得有点矛盾。我有一个web应用程序,MVC框架使用Stripes,后端使用Spring/Hibernate。我在MVC层中有一个帐户注册方法,需要进行以下验证: 用户名尚未使用 提供的电子邮件地址尚未与其他帐户关联 我在Stripes(MVC层)中有一个验证方法来检查这两种情况,但我想知道我的服务层是否应该重复这些检查?如果服务层接口作为web服务公开,那么我认为验证是一个好主意,但是如果它只用于web应用程序的上下文中,那么它是必需的吗 编辑:我不打算复制验证代码——我的意思是在两

我现在觉得有点矛盾。我有一个web应用程序,MVC框架使用Stripes,后端使用Spring/Hibernate。我在MVC层中有一个帐户注册方法,需要进行以下验证:

  • 用户名尚未使用
  • 提供的电子邮件地址尚未与其他帐户关联
我在Stripes(MVC层)中有一个验证方法来检查这两种情况,但我想知道我的服务层是否应该重复这些检查?如果服务层接口作为web服务公开,那么我认为验证是一个好主意,但是如果它只用于web应用程序的上下文中,那么它是必需的吗

编辑:我不打算复制验证代码——我的意思是在两个地方复制验证方法调用

我认为我的选择是:

  • 在MVC和服务层中复制验证调用
  • 仅在MVC层中执行此验证
  • 仅在服务层中执行此验证 这里的最佳实践是什么?我正在寻找关于我应该选择哪一个以及为什么选择的建议/意见

    注意,在注册表的输入字段上有简单的验证检查(比如检查空格),我认为这些应该只由MVC验证来处理;我只关心更复杂的验证

    不要重复代码。使用,以便在应用程序的所有层中使用相同的验证逻辑

    (Hibernate ORM的一个独立项目)提供了此接口的参考实现。使用起来非常简单,你可以

  • 理想情况下,在两个层中都进行验证,因为您的服务层可能与当前mvc层以外的客户机一起使用

  • 在两个地方重用验证机制(例如,Bean验证)


  • 在我看来,您应该区分两种验证:

    • 格式数据验证:应该在表示层(在您的案例中是MVC)中进行验证。通常在客户端和服务器端
    • 业务数据验证:应该在服务层验证哪些数据
    在您的案例中,您的验证与业务规则相关,因此我将仅将它们放在服务层中。 此外,如果在两个层中重复验证,则将进行两次相同的查询,从而降低应用程序的性能。

    好问题,我在很多场合也问过自己同样的问题。以下是我的结局(直到现在)

    最纯粹(但繁琐)的方法是在两个层中调用验证逻辑。 实用的方法可能是只在web领域调用它(例如,您的控制器)

    我认为没有答案可以结束所有的讨论。我认为这取决于你项目的背景。如果项目规模不大(就人员和代码库的规模而言),并且您确信调用您的服务API的其他人不会开发很多代码(到您无法监督的程度),那么只在web层进行验证就足够了

    但是,如果您希望有许多客户端,则可能需要更高级别的安全性。当我在这里说安全性时,我指的是您需要的一致性保证级别。 如果这个级别很高,就没有办法了:您必须在服务(为了安全)和web层(主要是为了能够为最终用户提供可接受的体验)两个方面都做到这一点


    因此,这里的关键驱动因素是安全性,以及您真正需要的安全性。如果你需要很多,你可以选择“纯粹主义”的方法。如果您的应用程序没有做出与生死相关的决策,您可以采用务实的方法。

    是的,我不是说我会重复验证代码-我是说我会在两个位置调用相同的验证代码正如您所提到的,那么您真的需要进行两次验证,如果除了控制器层之外还有其他客户端。我可能会发现,我可能也希望有不同的验证逻辑