我的一个项目使用 Spring MVC 来处理 URL 映射和调度逻辑。我现在必须使用第三方库,它使用自己的HttpServlet
作为其功能的主要入口点,但由于它是另一个库的可选插入式替代品,我不能只将<servlet>
声明放在 web.xml 中:I' d 宁愿使用 aController
和 Spring 配置文件在此类实现之间切换,而无需编辑 web.xml。
Spring 是否提供 OOTB 来处理此类情况?我似乎没有马上找到它。
提前致谢!
我的一个项目使用 Spring MVC 来处理 URL 映射和调度逻辑。我现在必须使用第三方库,它使用自己的HttpServlet
作为其功能的主要入口点,但由于它是另一个库的可选插入式替代品,我不能只将<servlet>
声明放在 web.xml 中:I' d 宁愿使用 aController
和 Spring 配置文件在此类实现之间切换,而无需编辑 web.xml。
Spring 是否提供 OOTB 来处理此类情况?我似乎没有马上找到它。
提前致谢!
由于在您的中注册第三方 servletweb.xml
是不可能的,我认为您最好的选择是在您的 中创建 servlet 的单例实例ApplicationContext
,然后创建一个委托给所述 servletservice
方法的自定义视图。
您可以在本教程中看到自定义视图的示例。
在这里回答我自己的问题,以防我的方法对其他人有用。
我需要考虑两个关键因素:
在我的具体情况下,不需要正确处理 servlet 破坏,因为它是无操作的。
我最终编写了一个专用的Controller
, 仅在激活特定的 Spring 配置文件时才被实例化,该配置文件负责实例化和初始化 Servlet。然后,所有的请求都会直接在一个void
handler 方法中处理,如下:
public class ServletDelegatingController implements ServletConfig {
private final DelegateServlet delegate = new DelegateServlet();
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
delegate.service(request, response);
}
// properly initializes the servlet
public void setServletConfig(ServletConfig servletConfig) {
try {
delegate.init(servletConfig);
} catch (ServletException e) {
throw new IllegalStateException("Failure while initializing the servlet", e);
}
}
}
对于看起来如下delegating-servlet.xml
:DispatcherServlet
<beans profile="custom">
<bean id="cmisServiceFactory"
class="com.foo.ServletDelegatingController"/>
</beans>