(RESTEASY)UndertowJaxrSpringServer
分析改造UndertowJaxrSpringServer
,核心是吃透DispatcherServlet
,从DispatcherServlet
里面获取ApplicationContext
。
从DispatcherServlet里面获取ApplicationContext
从ApplicationContext里面获取Dispatcher
其中springmvc-resteasy.xml
里面定义了dispatcher
:
分析undertow注入dispatcher-servlet的流程
上面是创建DispatcherServlet
的入口。接下来是undertow
里面的实现:
可以看到ServletInfo
里面封装servlet
的信息,并且是instanceFactory
最终会负责servlet
的创建。
结论:ServletInfo
是undertow
封装了DispatcherServlet
的类,里面包含instanceFactory
用于创建servlet instance
。
所以目标就是从ServletInfo
里面读取到DispatcherServlet
。达成这个目标需要查看undertow
里面ServletInfo
的源代码。
为了分析具体过程,先要在ServletInfo
里面设置断点:
然后执行测试:
获得stacktrace
:
根据上面的stacktrace
,最终找到了ManagedServlet
里面的getServlet(...)
方法:
而真正保存servlet
的地方是DeploymentImpl
:
这个是保存在DeploymentManagerImpl
:
所以上面的分析可以知道获取servlet
的一条线应该是这样的:
UndertowJaxrsServer
->DeploymentManager
->DeploymentImpl
->servlets
->getServlet(...)
因为UndertowJaxrsServer
不开放DeplomentManager
:
因此需要扩展UndertowJaxrSpringServer
,让它override
这个deploy(...)
方法,开放manager
。这个是接下来要做的工作。
然后回头看DeploymentImpl
,这个开放了getDeployment()
方法:
直接使用就好。
以上是分析过程,接下来直接往社区提交Pull Request
就可以了。