首页 > 其他分享 >DispatcherServlet类关于protected HandlerAdapter getHandlerAdapter解释

DispatcherServlet类关于protected HandlerAdapter getHandlerAdapter解释

时间:2024-07-05 10:53:41浏览次数:16  
标签:DispatcherServlet 适配器 getHandlerAdapter HandlerAdapter handler 处理器 protected han

	/**
	 * Return the HandlerAdapter for this handler object.
	 * @param handler the handler object to find an adapter for
	 * @throws ServletException if no HandlerAdapter can be found for the handler. This is a fatal error.
	 */
	protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
		if (this.handlerAdapters != null) {
			for (HandlerAdapter adapter : this.handlerAdapters) {
				if (adapter.supports(handler)) {
					return adapter;
				}
			}
		}
		throw new ServletException("No adapter for handler [" + handler +
				"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
	}

这段代码是 Spring MVC 框架中 DispatcherServlet 类或其子类中的一个方法,用于获取与给定的处理器(handler)兼容的 HandlerAdapter。HandlerAdapter 是 Spring MVC 中的一个接口,它定义了如何将请求映射到处理器(例如 @Controller 中的方法)并执行它们。

在这个方法中,this.handlerAdapters 是一个包含多个 HandlerAdapter 实现的列表。对于每个 HandlerAdapter,它都会调用 supports(handler) 方法来检查该适配器是否支持给定的处理器。如果找到支持该处理器的适配器,那么该方法将返回该适配器。

具体返回哪个 HandlerAdapter 的实现类取决于 this.handlerAdapters 列表中的适配器以及哪个适配器的 supports(handler) 方法返回 true。这通常取决于处理器的类型,因为不同的 HandlerAdapter 可能会支持不同类型的处理器。

例如:

HttpRequestHandlerAdapter 可能支持实现了 HttpRequestHandler 接口的处理器。
SimpleControllerHandlerAdapter(或其现代替代品,如 SimpleServletHandlerAdapter)可能支持实现了 Controller 接口的处理器。
AnnotationMethodHandlerAdapter(或其现代替代品,如 RequestMappingHandlerAdapter)可能支持使用 @RequestMapping 等注解的方法作为处理器。
如果没有任何适配器支持给定的处理器,那么该方法将抛出一个 ServletException,指示没有为处理器找到适配器,并建议检查 DispatcherServlet 的配置以确保包含了支持该处理器的 HandlerAdapter。

简而言之,具体返回哪个 HandlerAdapter 实现类取决于 this.handlerAdapters 列表中的适配器以及哪个适配器与给定的处理器兼容。

  • 注意:
    在 DispatcherServlet 中,private List handlerAdapters; 是一个私有成员变量,因此它通常不会直接通过外部代码访问。但是,你可以通过调试间接地查看或确定 handlerAdapters 列表中包含哪些 HandlerAdapter:
    调试: 在开发环境中,你可以使用IDE(如IntelliJ IDEA、Eclipse等)的调试功能来查看 handlerAdapters 列表的内容。你可以设置一个断点,在 DispatcherServlet 的某个生命周期方法(如 init())中暂停执行,然后检查 handlerAdapters 的值。

标签:DispatcherServlet,适配器,getHandlerAdapter,HandlerAdapter,handler,处理器,protected,han
From: https://www.cnblogs.com/DuWenjie/p/18285347

相关文章

  • QThread::run函数的使用(涉及到QThread::run, Qthread::start,protected,virtual虚函数,o
    RobotCommuServer.h#ifndefROBOTCOMMUSERVER_H#defineROBOTCOMMUSERVER_H#include<QThread>classRobotCommuServer:publicQThread{Q_OBJECTpublic:explicitRobotCommuServer(QObject*parent=nullptr);~RobotCommuServer();void......
  • C++PrimerPlus:第十三章类和继承:访问控制:protected
    第十三章类和继承:访问控制:protected提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:访问控制:protected提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录第十三章类和继承:访问控制:protected前言一、访问控制:protected总结......
  • public、private、protected、package、final
    public关键字用于将类、方法或变量声明为公共的,意味着它们可以被所有类访问。无限制,全局可见。private关键字用于将类、方法或变量声明为私有的,意味着它们只能在声明它们的类内部访问。仅限于同一类。java支持嵌套类,如果一个类内部还定义了嵌套类,那么,嵌套类拥有访问private的权......
  • C++访问限定符private、public、protected的使用场景
    众所周知,C++中有3种访问符,分别是private、public、protected。其中private和public比较好理解。private:只能由该类中的函数、其友元函数访问,不能被任何其他访问,更不能由该类的对象在类外进行访问,类成员变量一般修饰为private,防止类使用者不受约束地直接修改数据。public:......
  • java代码运行出现DENIED Redis is running in protected mode because protected mode
    这个错误是因为开启了保护模式,导致出错。所以需要关闭redis的保护模式。编辑redis的redis.config  注释bind127.0.0.1 、修改protected-mode为no、修改 daemonize为no然后重启redis ......
  • day12_我的Java学习笔记 (package包、权限修饰符_private+缺省+protected+public、fin
    1.包IDEA配置自动导包:2.权限修饰符同一个类中的,【private、缺省、protected、public】都可以访问同一个包中的其他类,【private】不可以访问,【缺省、protected、public】都可以访问不同包下的无关类,【private、缺省、protected】都不可以访问,只有【public......
  • C++继承之protected继承
    1概述  通过继承机制,可以利用已有的对象类型来定义新对象类型。所定义的新对象类型不仅仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。。2对象访问作用域作用域:publi......
  • Java访问权限之public、protected、private详解——【包和访问控制】【访问权限控制】
    @目录包和访问控制包声明和导入访问权限控制源码:Giteehttps://gitee.com/drip123456/java-seGIthubhttps://github.com/Drip123456/JavaSE专栏:JavaSE笔记专栏包和访问控制通过前面的学习,我们知道该如何创建和使用类。包声明和导入包其实就是用来区分类位置的东西,也可......
  • 类的public, private, protected有什么区别?
    如何区别C#private和protected?一、通过使用来区分1、private:编程语句在模块级别中使用,用于声明私有变量及分配存储空间。2、protected:编程语句在模块级别中使用,用于声明受保护的变量及分配存储空间。二、通过作用来区分1、private:只能在包含其声明的模块中使用。可以使用Pr......
  • 【愚公系列】2023年12月 通用职责分配原则(九)-受保护变量原则(Protected Variations
    ......