You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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映射冲突:

  1. 创建配置类,注册自定义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;
    }
}
  1. 移除自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:54:20