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

Spring Boot环境下Vaadin14创建Servlet添加会话监听器的实现问题

Vaadin 14 + Spring Boot 自定义Servlet无法识别URL问题及解决方案

我正在基于Spring Boot运行的Vaadin 14中创建Servlet,已经阅读了Vaadin应用生命周期的官方文档,参照文档尝试创建Servlet但未成功,网页无法识别对应的URL。我先后尝试了VaadinServlet和SpringServlet两种实现方式,初始代码如下:

@WebServlet(value = "name", urlPatterns = {"customservlet"})
public class CustomServlet extends SpringServlet implements SessionInitListener, SessionDestroyListener {

    public CustomServlet(ApplicationContext context, boolean forwardingEnforced) {
        super(context, forwardingEnforced);
    }

    @Override
    protected void servletInitialized() throws ServletException {
        super.servletInitialized();
        getService().addSessionInitListener(this);
        getService().addSessionDestroyListener(this);
    }

    @Override
    public void sessionInit(SessionInitEvent event)
            throws ServiceException {
        // 此处编写会话启动逻辑
    }

    @Override
    public void sessionDestroy(SessionDestroyEvent event) {
        // 此处编写会话销毁逻辑
    }


    @Override
    protected void service(HttpServletRequest request,
                           HttpServletResponse response) throws ServletException, IOException {

        getService().addSessionInitListener((SessionInitListener) event -> event.getSession().addRequestHandler(globalRequestHandler()));
        super.service(request, response);
    }

    public RequestHandler globalRequestHandler() {
        return (session, vaadinRequest, response) -> {
            if ("/customservlet".equals(vaadinRequest.getPathInfo())) {
                response.setContentType("text/html;charset=UTF-8");
                response.getWriter().append("some content");
                response.getWriter().flush();
                return true;
            } else  {
                return false;
            }
        };
    }
}

更新:
采用Leif的解决方案后问题已解决,最终可运行的实现代码如下,供其他开发者参考:

@Route("yourroute")
@SpringComponent
public class MyInitListener implements Serializable, VaadinServiceInitListener  {

    @Override
    public void serviceInit(ServiceInitEvent serviceEvent) {
        serviceEvent.getSource().addSessionInitListener(initEvent -> {
            initEvent.getSession().addRequestHandler(globalRequestHandler());

        });
        serviceEvent.getSource(). addSessionDestroyListener(initEvent -> {
            initEvent.getSession().close();
        });
    }

public RequestHandler globalRequestHandler() {
        return (session, vaadinRequest, response) -> {
            if ("/yourroute".equals(vaadinRequest.getPathInfo())) {
                response.setContentType("text/plain");
                PrintWriter pw = response.getWriter();
                pw.write("Some content");
                pw.close();
                return true;
            } else  {
                return false;
            }
        };
    }
}

内容的提问来源于stack exchange,提问作者Aigeth Magendran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:09:02