(RESTEASY)UndertowJaxrSpringServer

分析改造UndertowJaxrSpringServer,核心是吃透DispatcherServlet,从DispatcherServlet里面获取ApplicationContext

从DispatcherServlet里面获取ApplicationContext

从ApplicationContext里面获取Dispatcher

其中springmvc-resteasy.xml里面定义了dispatcher

分析undertow注入dispatcher-servlet的流程

上面是创建DispatcherServlet的入口。接下来是undertow里面的实现:

可以看到ServletInfo里面封装servlet的信息,并且是instanceFactory最终会负责servlet的创建。

结论:ServletInfoundertow封装了DispatcherServlet的类,里面包含instanceFactory用于创建servlet instance

所以目标就是从ServletInfo里面读取到DispatcherServlet。达成这个目标需要查看undertow里面ServletInfo的源代码。

为了分析具体过程,先要在ServletInfo里面设置断点:

然后执行测试:

获得stacktrace

根据上面的stacktrace,最终找到了ManagedServlet里面的getServlet(...)方法:

而真正保存servlet的地方是DeploymentImpl

这个是保存在DeploymentManagerImpl

所以上面的分析可以知道获取servlet的一条线应该是这样的:

因为UndertowJaxrsServer不开放DeplomentManager

因此需要扩展UndertowJaxrSpringServer,让它override这个deploy(...)方法,开放manager。这个是接下来要做的工作。

然后回头看DeploymentImpl,这个开放了getDeployment()方法:

直接使用就好。

以上是分析过程,接下来直接往社区提交Pull Request就可以了。