O WebApplicationInitializer fornece uma maneira de representar programaticamente uma boa parte de um arquivo web.xml padrão – os servlets, filtros, ouvintes.
No entanto, não consegui descobrir uma boa maneira de representar esses elementos (session-timeout, error-page) usando o WebApplicationInitializer, é necessário manter um web.xml para esses elementos?
30 java.lang.Exception /uncaughtException 404 /resourceNotFound
Eu fiz um pouco de pesquisa sobre este tópico e descobri que para algumas das configurações como sessionTimeOut e páginas de erro você ainda precisa ter o web.xml.
Olhe para este Link
Espero que isso ajude você. Felicidades.
Usando spring-boot é muito fácil.
Tenho certeza de que isso poderia ser feito sem a boot da primavera, estendendo o SpringServletContainerInitializer . Parece que é para isso que é especificamente projetado.
Servlet 3.0 ServletContainerInitializer projetado para oferecer suporte à configuração baseada em código do contêiner do servlet usando o SPI do WebApplicationInitializer do Spring, em oposição a (ou possivelmente em combinação com) a abordagem tradicional baseada no web.xml.
Exemplo de código (usando SpringBootServletInitializer)
public class MyServletInitializer extends SpringBootServletInitializer { @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory(8080); // configure error pages containerFactory.getErrorPages().add(new ErrorPage(HttpStatus.UNAUTHORIZED, "/errors/401")); // configure session timeout containerFactory.setSessionTimeout(20); return containerFactory; } }
Na verdade, o WebApplicationInitializer
não fornece isso diretamente. Mas há uma maneira de definir sessointimeout com a configuração do java.
Você precisa criar um HttpSessionListner
primeiro:
import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { //here session will be invalidated by container within 30 mins //if there isn't any activity by user se.getSession().setMaxInactiveInterval(1800); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("Session destroyed"); } }
Depois disso, apenas registre este ouvinte com o contexto do servlet, que estará disponível no WebApplicationInitializer
sob o método onStartup
servletContext.addListener(SessionListener.class);
Estendendo no comentário do BwithLove, você pode definir a página de erro 404 usando a exceção e o método do controlador que é @ExceptionHandler:
Classe WebAppInitializer:
public class WebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { DispatcherServlet dispatcherServlet = new DispatcherServlet(getContext()); dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); ServletRegistration.Dynamic registration = container.addServlet("dispatcher", dispatcherServlet); registration.setLoadOnStartup(1); registration.addMapping("/"); } private AnnotationConfigWebApplicationContext getContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation("com.my.config"); context.scan("com.my.controllers"); return context; } }
Classe do controlador:
@Controller @ControllerAdvice public class MainController { @RequestMapping(value = "/") public String whenStart() { return "index"; } @ExceptionHandler(NoHandlerFoundException.class) @ResponseStatus(value = HttpStatus.NOT_FOUND) public String requestHandlingNoHandlerFound(HttpServletRequest req, NoHandlerFoundException ex) { return "error404"; } }
“error404” é um arquivo JSP.
Em web.xml
3 -->
Classe de ouvinte
public class ProductBidRollBackListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { //To change body of implemented methods use File | Settings | File Templates. } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { HttpSession session=httpSessionEvent.getSession(); WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext()); ProductService productService=(ProductService) context.getBean("productServiceImpl"); Cart cart=(Cart)session.getAttribute("cart"); if (cart!=null && cart.getCartItems()!=null && cart.getCartItems().size()>0){ for (int i=0; i