Personalizar os erros do Spring MVC

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>

Basta adicionar um erro a mais no web.xml, mapear o erro no contexto do Spring, implementar um método a mais desse erro:

web.xml

<error-page>
  <exception-type>org.springframework.dao.DataIntegrityViolationException</exception-type>
   <location>/errorDuplicateId.htm</location>
 </error-page>

Erros Controller

public ModelAndView handleduplicateIdError(HttpServletRequest request, HttpServletResponse response) throws ServletException {  
   logger.error("Id já cadastrado");  
   return handleError(request, response, "errorDuplicateId");  
} 

Fica a dica para quem precisar.

Não sei se entendi, mas talvez possa te ajudar.

O Spring possibilita tratar as exceções da seguinte maneira:

	<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="org.springframework.dao.DataIntegrityViolationException">redirect:/tratarErro.htm</prop>
			</props>
		</property>
	</bean>