Olá, com personalizar o controle de erro do Spring MVC:
O controle de erro da aplicação é feito nessa classe:
public class ErrorsController extends MultiActionController {
private final Log logger = LogFactory.getLog(getClass());
protected static String[] vars = {
"javax.servlet.error.status_code",
"javax.servlet.error.exception_type",
"javax.servlet.error.message",
"javax.servlet.error.exception",
"javax.servlet.error.request_uri"
};
// handlers
/**
* Custom handler
* @param request current HTTP request
* @param response current HTTP response
* @param viewName error page to be called
* @return a ModelAndView to render the response
*/
public ModelAndView handleError(HttpServletRequest request, HttpServletResponse response, String viewName) throws ServletException {
logger.error("Error Handling");
for (int i = 0; i < vars.length; i++) {
logger.error("tipo " + vars[i] + ": " + request.getAttribute(vars[i]));
}
logger.error("pagina de erro " + viewName);
return new ModelAndView(viewName);
}
public ModelAndView handleHttp404(HttpServletRequest request, HttpServletResponse response) throws ServletException {
logger.error("Page Not Found");
return handleError(request, response, "errorNotFound");
}
public ModelAndView handleDBError(HttpServletRequest request, HttpServletResponse response) throws ServletException {
logger.error("DB Error");
return handleError(request, response, "errorDB");
}
public ModelAndView handleGenericError(HttpServletRequest request, HttpServletResponse response) throws ServletException {
logger.error("Generic Error");
return handleError(request, response, "errorGeneral");
}
public ModelAndView handleNullError(HttpServletRequest request, HttpServletResponse response) throws ServletException {
logger.error("Null Error");
return handleError(request, response, "errorGeneral");
}
public ModelAndView handleLimitError(HttpServletRequest request, HttpServletResponse response) throws ServletException {
logger.error("Limit Error");
return handleError(request, response, "errorLimit");
}
public ModelAndView handle500Error(HttpServletRequest request, HttpServletResponse response) throws ServletException {
logger.error("500 Error");
return handleError(request, response, "errorGeneral");
}
public ModelAndView handleSessionError(HttpServletRequest request, HttpServletResponse response) throws ServletException {
logger.error("Session Not Found");
return handleError(request, response, "errorSession");
}
Mas preciso mapear um erro especifico que é o de org.springframework.dao.DataIntegrityViolationException de codigo já cadastrado, qual a solução mais elegante?
Esse erro sempre cai em generalError eu precisava criar algo como:
public ModelAndView duplicateIdError(HttpServletRequest request, HttpServletResponse response) throws ServletException {
logger.error("Id já cadastrado");
return handleError(request, response, "errorDuplicateId");
}
O spring pega o que ta no web.xml também é isso?
O meu arquivo esta assim:
<error-page>
<exception-type>org.springframework.web.servlet.support.SessionRequiredException</exception-type>
<location>/sessionError.htm</location>
</error-page>
<error-page>
<exception-type>java.lang.NumberFormatException</exception-type>
<location>/numberFormatError.htm</location>
</error-page>
<error-page>
<exception-type>org.springframework.web.multipart.MaxUploadSizeExceededException</exception-type>
<location>/errorLimit.htm</location>
</error-page>
<error-page>
<exception-type>org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException</exception-type>
<location>/errorLimit.htm</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/errorNull.htm</location>
</error-page>
<error-page>
<exception-type>java.sql.Exception</exception-type>
<location>/dbError.htm</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/notFoundError.htm</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500.htm</location>
</error-page>