2 votes

Création d'une servlet dans Vaadin avec Spring Boot pour ajouter des écouteurs de session

J'essaie de créer une servlet dans Vaadin 14 fonctionnant avec Spring boot. J'ai lu la page sur le cycle de vie de l'application sur Cycle de vie des applications Vaadin et j'ai essayé de créer une servlet avec l'aide de celui-ci mais je n'ai pas réussi. Ma page Web ne semble pas reconnaître l'URL. J'ai essayé à la fois VaadinServlet et SpringServlet, voici mon code :

@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 {
        // Do session start stuff here
    }

    @Override
    public void sessionDestroy(SessionDestroyEvent event) {
        // Do session end stuff here
    }

    @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;
            }
        };
    }
}

Edit : Ca a marché avec Leifs avec la solution. Voici les résultats si quelqu'un veut savoir :

@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;
            }
        };
    }
}

5voto

Leif Åstrand Points 2658

Je vais essayer de donner une réponse à la chose que vous semblez vouloir réaliser (ajouter des écouteurs de session) plutôt qu'à la façon dont vous essayez de le faire (créer une servlet personnalisée).

La façon la plus simple d'ajouter ces écouteurs est d'utiliser un fichier de type VaadinServiceInitListener . En utilisant Spring, vous pouvez le faire simplement en définissant un bean qui implémente cette interface.

@Component
public class MyInitListener implements VaadinServiceInitListener {
  @Override
  public void serviceInit(ServiceInitEvent serviceEvent) {
    serviceEvent.getSource().addSessionInitListener(initEvent -> {
      // Do session start stuff here      
    });
    serviceEvent.getSource(). addSessionDestroyListener(initEvent -> {
      // Do session end stuff here      
    });
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X