Alguém pode me dizer como posso fazer para deixar esses erros com uma pagina personalizada?
Alguém pode me dizer como posso fazer para deixar esses erros com uma pagina personalizada?
Oi Diego, tudo bem? Olha, no curso de Spring MVC II tem uma aula específica pra isso. Você já fez esse curso?
sim estou cursando lá ensina a fazer uma classe para capturar esses erros, fiz aqui modificando de String para ModelAndView, e ela não pega um erro 404 por exemplo.
@ControllerAdvice
public class ExceptionHandlerController {
@ResponseStatus(value = HttpStatus.PRECONDITION_FAILED)
@ExceptionHandler(Exception.class)
@RequestMapping(value = "/erros")
public ModelAndView tratadorDeException() {
ModelAndView modelAndView = new ModelAndView();
//
modelAndView.setViewName("erros");
return modelAndView;
}
Experimenta usar HttpStatus.NOT_FOUND
ao invés do HttpStatus.PRECONDITION_FAILED
e vê se funciona?
Nada rs. Deixa te explicar a situação pode ser que a solução seja outra. se eu digito um uri que não existe ele cai nesse erro 404
http://localhost:8081/Sistema/admin
esse /admin não existe, então a classe deveria capturar esse erro não?
minha controller tem essa uri apenas como referencia, ela não possuiu uma view, só recursos com /admin/alterar etc
@RequestMapping(value = "/admin")
public class AdminController {
//codigo............
}
Diego, eu acho que a solução é remover esse RequestMapping ai. Por causa do seguinte: Quando há o RequestMapping o Spring relaciona a Exception com a rota configurada. Desse jeito você só vai ter uma página 404 quando acessar algo do tipo : localhost:8080/erros/algo-que-nao-existe
.
Se você remover o RequestMapping, talvez assim o Spring relacione qualquer 404 ao seu método. Faz o teste. =)
não mudou nada, removi essa mapping e alterei as outras para não dar erro, mas se acesso aquela uri continua com 404
Espera, acho que você não entendeu o que quiz dizer sobre remover o RequestMapping. Posta novamente sua classe com @ControllerAdvise
por favor!
continua com erro
@ControllerAdvice
public class ExceptionHandlerController {
@ResponseStatus(value = HttpStatus.PRECONDITION_FAILED)
@ExceptionHandler(Exception.class)
// @RequestMapping(value = "/erros")
public ModelAndView tratadorDeException() {
ModelAndView modelAndView = new ModelAndView();
//
modelAndView.setViewName("erros");
return modelAndView;
}
}
Deixa assim pra ver?
@ControllerAdvice
public class ExceptionHandlerController {
@ResponseStatus(value = HttpStatus.NOT_FOUND)
@ExceptionHandler(Exception.class)
public ModelAndView tratadorDeException() {
ModelAndView modelAndView = new ModelAndView();
//
modelAndView.setViewName("erros");
return modelAndView;
}
}
Por que o NOT_FOUND é quem realmente trata o erro 404. O PRECONDITION_FAILED é outro código HTTP.
O erro persiste. mesmo com esse código acima
Diego, essa view erros existe?
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://www.springframework.org/security/tags"
prefix="security"%>
<!DOCTYPE>
<head>
<meta charset=UTF-8>
<title>Cadastro</title>
<c:url value="/" var="contextPath" />
<script type="text/javascript"
src="${contextPath}resources/js/jquerymin.js"></script>
<script type="text/javascript"
src="${contextPath}resources/js/controle.js"></script>
<script type="text/javascript"
src="${contextPath}resources/js/bootstrap.min.js"></script>
<link href="${contextPath}resources/css/bootstrap.min.css"
rel="stylesheet" type="text/css" media="all" />
<link href="${contextPath}resources/css/bootstrap.min.css"
rel="stylesheet" type="text/css" media="all" />
<link href="${contextPath}resources/images/logo.png" rel="icon"
type="image/icon" media="all" />
<link href="${contextPath}resources/css/bootstrap-theme.min.css"
rel="stylesheet" type="text/css" media="all" />
<style type="text/css">
body {
background: #3c3c3c;
}
</style>
</head>
<body>
<div class="text-center jumbotron" style="margin-top: 200px">
<%-- <img src="${contextPath}resources/images/acessoNegado.jpg"> --%>
<h1>Desculpe, Rescurso não disponivel!</h1>
<a href="/SistemaGerenciador/" class="btn btn-info" role="button">Voltar
para Home</a>
</div>
</body>
</html>
No web.xml, tenta adicionar o seguinte:
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
E coloque essa exception no advice => @ExceptionHandler({NoHandlerFoundException.class})
deixei assim
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
e a controller assim
@ControllerAdvice
public class ExceptionHandlerController {
@ResponseStatus(value = HttpStatus.NOT_FOUND)
@ExceptionHandler({NoHandlerFoundException.class})
// @ExceptionHandler(Exception.class)
public ModelAndView tratadorDeException() {
ModelAndView modelAndView = new ModelAndView();
//
modelAndView.setViewName("erros");
return modelAndView;
}
}
mas continua com 404 :(
A página erros ta onde?]
está dentro da pasta /WEB-INF/views/erros.jsp
É... esgotei minhas possibilidades.. . precisava ver o projeto para descobrir.. Tem que ir debugando para ver exatamente onde está o erro...
Esse é o problema hehe, em debug ele sequer entra na classe de exception....
apesar que eu tenho um último chute.. vamos lá...
Na classe ServletSpringMVC, caso não tenha adiciona o método customizeRegistration.
@Override
protected void customizeRegistration(Dynamic registration) {
super.customizeRegistration(registration);
registration.setMultipartConfig(new MultipartConfigElement(""));
registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
}
A parte do multipartconfig é só por conta do upload.. mas vc já deve ter feito.
deixei assim e nada tirei o super pois estava com erro quando dava import do Dynamic
protected void customizeRegistration(Dynamic registration) {
customizeRegistration(registration);
// registration.setMultipartConfig(new MultipartConfigElement(""));
registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
}
Consegui Alberto! :) eu dei uma pesquisada em erros semelhantes e fui testando com os codigos ai achei esse aqui : Obrigado pela ajuda.
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/erros.jsp</location>
</error-page>
Esse aí é o jeito padrão, da spec de servlets... Tava tentando fazer funcionar o tratamento pelo Spring mesmo. De todo jeito, se esse funcionou para vc, ótimo!
Seria ótimo pelo spring, mas por enquanto já me ajudou muito dessa forma. :)