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
相关产品推荐
相关产品推荐

