当前位置: 首页 > 知识库问答 >
问题:

在Spring MVC中验证控制器还是服务层?

百里意智
2023-03-14

在相当长的一段时间里,我试图找出在Spring MVC应用程序中应该在哪里对用户输入进行验证。在许多在线博客和教程中,我基本上读到控制器应该验证用户的输入,如果无效,则通过显示包含错误消息的页面来响应用户。然而,我目前对Spring和Spring MVC分层系统的理解是,控制器只是应用程序逻辑(服务层)和“Web世界”之间的一个浅层接口,允许从Web使用服务层。而且,就我所见,Spring MVC确实只提供了合理的工具来验证控制器。

如果现在验证是在控制器中进行的,如果以后我想将应用程序逻辑从“Web世界”中解脱出来,那么验证逻辑必须在新的环境中重新实现(例如,使用Swing的桌面应用程序)。在我看来,决定域对象上哪些操作“有效”以及这些对象可能具有哪些“有效”状态的能力是服务层的核心部分,而不是应用程序的其他部分(例如控制器)所关心的。

共有1个答案

冀景明
2023-03-14

一种常见的方法是在这两个地方进行验证。但是如果你说的是@Valide,根据我的经验,放在控制器级别上更好。

这也取决于我们谈论的是什么样的验证逻辑。假设你有一个豆子:

@Data
public class MyBean {
    @NotNull private UUID someId;
    @NotEmpty private String someName; 
}

在控制器级别用@valid注释这个bean是有意义的,这样它甚至不能到达服务。将@valid放在服务方法上没有任何好处,因为为什么要进一步传播它,而您可以立即在控制器中决定它是否是那种有效的。

根据不同的解析机制(例如,jstl或jackson等),您可能倾向于以不同的方式处理验证。例如,传统的jstl视图解析器可以很好地使用一个使用错误的装置,而jackson解析器可以更好地使用@ResponseBody和一些过滤器的组合,这些过滤器捕捉错误并将它们放在响应对象的预定义错误部分。

 类似资料:
  • 也许这是一个微不足道的情况,但它对我来说很困惑,我需要一些澄清,如何以正确的方式处理它。 为了简单起见,模型如下: (User被分配给许多项目,且project有许多用户被分配给)。 null 允许两个http操作: API控制器使用服务层来执行这些操作。服务接口为休闲状态: 服务使用dbContext来执行这些操作。 问题1:哪个元素应该负责检查projectId和userId是否正确?IMHO

  • 我们正在尝试做一些具有登录屏幕的网站。但是我们有一个问题。我们的域是本地主机/登录/用户。但是,如果用户进入localhost/Home/Index,他/她无需登录即可访问我们的主站点。因此,我们将 [授权] 写入索引控制器。但我不知道我必须使用什么。我是否必须在我们的项目中使用AuthorizeAttribute? 如何访问LoginController/Authentication函数中的索引

  • 我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"

  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?

  • 问题内容: 我已经阅读了几篇有关angularjs实体正确用法的文章:服务,工厂,控制器和指令。 我特别关心的是控制器和服务的比较。但是,没有一个帖子告诉我什么是控制器可以执行服务不能执行的操作,反之亦然。 可以列出它吗?或者仅仅是在angular的用法上规范? 问题答案: 控制器 通常用于绑定视图。控制器管理视图的生命周期,应将其视为视图控制器。将为视图的每个实例创建一个新的控制器,这意味着,如

  • 我正在使用Spring形式。我只需要得到Staemap作为响应,但我得到的是整个jsp页面作为响应。