I try to capture the 404 error of my application with Spring mvc and then send it to a view. But I do not know what error I can have the code that does not catch the error. I leave my code in case someone could help me and see where the fault is or what I need to put.
On the WebInitializer.java page, I have this:
/**
* Clase de inicializacion de la aplicacion web
*/
public class WebAppInitializer extends AbstractWebApplicationInitializer {
private static final Logger LOGGER = AppLoggerFactory.getLogger(WebAppInitializer.class);
/**
* Contructor de una instancia de inicializacion web,
* incluimos el logger de arranque
*/
public WebAppInitializer() {
LOGGER.info("Starting.... {}", this.getClass().getName());
}
@Override
protected Class<?>[] preRootContextClassConfiguration() {
return new Class[] {
WebservicesConfiguration.class,
ServiceConfiguration.class
};
}
@Override
protected Class<?>[] preServletConfigClasses() {
return new Class[] { WebMvcConfiguration.class };
}
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
boolean done = registration.setInitParameter("throwExceptionIfNoHandlerFound", "true"); // -> true
if(!done) throw new RuntimeException();
}
}
On the WebMvcConfiguration.java page:
/**
* Clase que configura Spring MVC en la aplicacion
* <p/>
* TODO: Hay que anadir para escanear los paquetes que necesite la
aplicacion
**/
@Configuration
@EnableWebMvc
@ComponentScan({"com.isb.preferencias.*.web"})
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Value("${static.version}")
private String version;
@Value("${static.cache}")
private Integer cache;
/**
* Configura el gestor de recursos para que mapee las peticiones a las
rutas "/static/**" a los
* ficheros ubicados bajo la carpeta "static" en el classpath.
*/
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
registry.addResourceHandler("/static/**").addResourceLocations("classpath:static/")
.setCacheControl(CacheControl.maxAge(cache, TimeUnit.DAYS)).resourceChain(false)
.addResolver(new VersionResourceResolver().addFixedVersionStrategy(version, "/**"));
}
/**
* Configura el gestor de mapeos
*
* @return el RequestMappingHandlerMapping configurado para hacer
correspondencia exacta
*/
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
configurer.setUseTrailingSlashMatch(false);
}
/**
* Configura el messages Resource
*
* @return una instancia del gestor de mensajes de la aplicacion. TODO:
quitar este metodo si no
* se va a usar un MessageSource
*/
@Bean(name = "messageSource")
public MessageSource configureMessageSource() {
SerializableResourceBundleMessageSource messageSource =
new SerializableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
return messageSource;
}
/**
* Locale Resolver
*
* @return
*/
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(new Locale("es", "ES"));
return localeResolver;
}
}
And in the ErrorController.java:
/**
* Controller que trata lo endpoints a los que la arquitectura redirige cuando
* se han producido errores no controlados.
*/
@Controller
public class ErrorController {
/**
* Trata los errores no controlados de peticiones que no esperaban
* respuestas json ni xml.
*
* @param request
* objeto {@link HttpServletRequest} de la peticion que contiene
* un atributo "exception" con la excepcion causante del error.
* @param model
* objeto {@link Model} para rellenar la respuesta.
* @return nombre de la vista/plantilla que renderiza el mensaje de error.
*/
@RequestMapping(value = "/error/error/default")
public String handleExceptionDefault(HttpServletRequest request, Model model) {
// TODO: realizar el tratamiento deseado (normalmente devolver un
// mensaje de error generico)
return null;
}
/**
* Trata los errores no controlados de peticiones que esperaban respuestas
* json.
*
* @param request
* objeto {@link HttpServletRequest} de la peticion que contiene
* un atributo "exception" con la excepcion causante del error.
* @return objeto de respuesta con el mensaje de error.
*/
@RequestMapping(value = "/error/json")
@ResponseBody
public ResponseEntity<String> handleExceptionJson(HttpServletRequest request) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
/**
* Trata los errores no controlados de peticiones que esperaban respuestas
* xml.
*
* @param request
* objeto {@link HttpServletRequest} de la peticion que contiene
* un atributo "exception" con la excepcion causante del error.
* @return objeto de respuesta con el mensaje de error.
*/
@RequestMapping(value = "/error/xml")
@ResponseBody
public Object handleExceptionXml(HttpServletRequest request) {
// TODO: realizar el tratamiento deseado (normalmente devolver un xml de
// error generico)
return null;
}
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="")
@ExceptionHandler(Exception.class)
public Object KeywordNotFoundException(Model m){
m.addAttribute("error");
return (m);
}
}