微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring MVC @Controller 的处理程序方法的参数如何在运行时自动解析?

如何解决Spring MVC @Controller 的处理程序方法的参数如何在运行时自动解析?

dispatcherServlet(或任何其他支持 Spring MVC 基础架构的 bean)如何动态解析 @Component 实例的处理程序方法的签名,以及它如何知道哪些参数/类型是预期的,按什么顺序,在那个方法中?

如果我有一个@RequestMapping-ed”处理程序方法,在我的 @Controller 实例中,定义其签名的任何版本:

public String f() {...}

public String f(Model model) {...}

public String f(HttpServletRequest,Model model) {...}

public String f(Model model,HttpServletRequest) {...}

public String f(SomeEntity se,Model model,HttpServletRequest,AnotherModel am) {...}

//so on..

可以正常工作,不考虑参数数量、类型和顺序,最终会提供相应的参数,再次 - 忽略它们的数量、顺序和类型。

下面应该有相当多的工作要做,正确实例化预期的参数,以正确的顺序传递它们,如果需要,甚至可以做一些类型转换......等等,但我不要掌握这个的基本原理。

我从 spring-webmvc 模块中查找了相应的源,以及 dispatcherServlet 的源;但是,还没有完全掌握底层机制。

我可以猜测,可能涉及到一些 BeanPostProcessor ......进行反射访问等等......但即使在这种情况下,由于我不确定发生了什么,我将非常感激任何有价值的输入。

解决方法

在 Spring MVC 中,HandlerMapping 有 3 个实现:BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping 和 ControllerClassNameHandlerMapping。 您可以在此处阅读有关此主题的更多信息: https://www.baeldung.com/spring-handler-mappings

,

我已经很多年没有使用 Spring,但这篇文章提供了一个非常好的 spring mvc request lifecycle

当 DispatcherServlet 接收到一个请求时,它会遍历这个列表,直到找到一个与该请求匹配的处理程序对象。为简单起见,我们只考虑 RequestMappingHandlerMapping。

这种类型的 bean 存储@RequestMapping 注释方法(通过反射检索的实际 Method 对象)的映射,这些方法存储为 HandlerMethod 实例并包装在 RequestMappingInfo 对象中,这些对象包含用于匹配请求的映射数据,即。网址、标头和请求参数。

DispatcherServlet 从这些和您可能已注册的任何相应 HandlerInterceptor 实例中检索最匹配的 HandlerMethod。它将这些检索为 HandlerExecutionChain 对象。它将首先应用 HandlerInterceptors 的任何预处理。然后它将尝试调用您的 HandlerMethod。这通常(但不总是)是 @Controller 注释类中的 @RequestMapping 注释方法。这会产生 Spring 所说的调度结果。 DispatcherServlet 然后应用 HandlerInterceptors 的后处理。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?