在控制器或服务层中的Spring MVC中进行验证?

亚历克斯·里森菲尔德:

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

如果现在在Controller中进行验证,那么在以后的某个时间我想将应用程序逻辑与“网络世界”分离,则必须在新环境中重新实现验证逻辑(例如,使用Swing的桌面应用程序)。我认为,决定哪些操作对域对象“有效”以及此类对象可能具有的“有效”状态的能力是服务层的核心部分,而不是应用程序其他部分的关注(例如,控制器)。

在这种情况下,为什么将输入验证逻辑放置在控制器层而不是服务层中是“优良作法”?

尼古拉·约夫切夫:

一种常见的方法是在两个地方都进行验证。但是,如果您在谈论@Valid,根据我的经验,最好将其设置为Controllers级别。

这也取决于我们在谈论哪种验证逻辑。假设您有一个bean:

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

@Valid在控制器级别对此bean进行注释是有意义的,因此它甚至无法到达服务。放置@Validservice方法没有任何好处,因为为什么要进一步传播它,而又可以立即在控制器中确定它是否有效。

然后是第二种验证类型:业务逻辑验证。假设对于同一个bean,someId属性是一个timeUUid,并且它的时间戳最多需要在发生某个事件后2天,否则,该bean应该被服务丢弃。

这似乎是一个业务逻辑验证案例,因为仅查看Bean,您将无法对其进行验证,除非您对其应用了一些逻辑。

由于两种验证方法实际上都验证了不同的事物,因此很明显,您的每个MVC组件(模型,视图和控制器)都进行了自己的验证,并且在不引入对其他组件的依赖性的情况下进行验证应该是合理的。

至于向用户显示错误,是的,Errors对象确实旨在用于控制器级别的bean验证,但是您可以设计一些过滤器来捕获任何级别的异常,然后为用户格式化。有很多方法可以解决,而且我不确定Spring是否规定任何方法都比其他方法更好

根据不同的解析机制(例如jstl或jackson或其他),您可能倾向于以不同的方式处理验证例如,传统的jstl视图解析器可以很好地处理使用Errors的组件,而jackson解析器可能可以结合使用@ResponseBody和一些捕获错误并将其放入响应对象的预定义错误部分的过滤器来更好地工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

dao 服务层和控制器层中的 Spring MVC Transactional

如何在Spring MVC中实现控制器和服务层之间的正确交互

Spring MVC与Web应用程序中的服务,控制器和数据访问层有何关系?

如何在Spring MVC中进行验证处理

有 DTO 时如何在 Spring MVC 中进行验证?

是否可以在单击提交按钮以在MVC中进行验证之前将多个参数传递给控制器?

在Spring中进行表单验证

MVC服务层-每个控制器或其他设计的服务?

无法检索从控制器发送的值以在Spring MVC中进行查看

避免在更新时已经存在验证,并在Spring MVC中进行更新

在MVC5中进行验证时,将数据保留在ViewModel中

在服务层中进行验证时测试Web层-Spring Boot测试

通过OnAuthentication在MVC5中进行其他身份验证

解决服务中的承诺而无需在控制器中进行回调

使用 Core PHP 中的控制器进行服务器端验证

在域服务的域模型中进行验证?

将身份验证推迟到控制器层 spring-security

用于在nesjts中进行验证的自定义装饰器-在服务层上

无法在Bootstrap 4中进行验证

如何在5.2中进行验证?

在symfony 1.4中进行验证

如何在服务中获取控制器的ModelState以进行验证

同一控制器的多个Spring MVC验证器

使用正则表达式在控制器中进行验证

Kotlin Spring Boot中的控制器验证

在服务器端(控制器)进行验证是一种好习惯吗?ASP.NET MVC

从BLL层到MVC5中的控制器的调用函数

为什么我的验证器未在Laravel中进行验证?

如何在 ASP.NET MVC5 中的视图模型中进行字符串“不喜欢”验证?