如何在Vaadin 23 + Spring Boot 2.7.1中添加独立自定义Servlet
问题
基于Vaadin 23 + Spring Boot 2.7.1开发网站时,需创建独立Servlet处理与另一服务器WebApp的POST通信,编写的Servlet代码如下:
@WebServlet(urlPatterns = "/communication", name = "QuizServlet", asyncSupported = true) public class QuizServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendError(400, "Not implemented"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendError(400, "Not implemented"); } }
但所有请求始终被重定向到默认DispatcherServlet,尝试过的无效方案包括:
- SpringVaadinServlet已废弃,继承VaadinServlet无效
- 修改
vaadin.url-mapping配置无效,所有请求仍重定向到新映射 - 在不同端口配置Servlet,通过WebMvcConfigurer配置Tomcat连接器注册自定义Servlet,仍存在重定向问题
- 实现WebApplicationInitializer直接注册Servlet无效果
请问如何在该技术栈中实现两个独立的Servlet?
解决方案
方法一:通过ServletRegistrationBean手动注册自定义Servlet
Spring Boot中推荐用这种方式替代@WebServlet注解,规避与Vaadin的Servlet映射冲突:
- 创建配置类,注册自定义Servlet:
import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ServletConfig { @Bean public ServletRegistrationBean<QuizServlet> quizServletRegistration() { ServletRegistrationBean<QuizServlet> registrationBean = new ServletRegistrationBean<>(new QuizServlet(), "/communication/*"); registrationBean.setName("QuizServlet"); registrationBean.setAsyncSupported(true); // 设置启动加载优先级,确保自定义Servlet先于Vaadin Servlet匹配请求 registrationBean.setLoadOnStartup(1); return registrationBean; } }
- 移除自定义Servlet上的
@WebServlet注解,避免重复注册引发冲突。
方法二:缩小Vaadin的Servlet映射范围
在application.properties或application.yml中配置Vaadin的URL映射,限制其仅处理特定路径(比如/vaadin/*):
# application.properties vaadin.url-mapping=/vaadin/*
配置后,Vaadin的Servlet仅处理以/vaadin/开头的请求,/communication路径会自动交由自定义Servlet处理。
核心注意事项
- 确保自定义Servlet的路径与Vaadin的路径无重叠,否则会被Vaadin Servlet拦截
- 不要混用
@WebServlet和@ServletComponentScan,Vaadin的自动配置会干扰Servlet匹配顺序 - 使用方法一时,
setLoadOnStartup(1)可确保自定义Servlet优先匹配请求
内容的提问来源于stack exchange,提问作者Malcador
相关产品推荐
相关产品推荐

