Spring Boot - page 404 personnalisée avec Tomcat autonome
J'exécute une application de démarrage Spring dans une instance Tomcat autonome et j'essaie de remplacer les pages d'erreur. D'après ce que je comprends, Spring fournit un filtre ErrorPageFilter qui me permet de simplement configurer les pages d'erreur comme d'habitude pour que Springs EmbeddedServletContainerCustomizer
gère ce cas exactement.
J'ai donc mon initialiseur de configuration automatique / servlet standard dans une classe:
@Configuration
@ComponentScan
@EnableAutoConfiguration(exclude = [ GroovyTemplateAutoConfiguration, SecurityAutoConfiguration, ErrorMvcAutoConfiguration, JmxAutoConfiguration ] )
class Application extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
application.sources( Application )
}
(J'utilise la même classe pour l'autoconfiguration et le servlet init, c'est pourquoi je passe simplement ma Application
classe dans la méthode configure)
En regardant le code source de SpringBootServletInitializer, il semble que la ErrorPageFilter
classe est ajoutée en étendant simplement cette classe ici. J'ai désactivé le ErrorMvcAutoConfiguration
- mais encore une fois, en regardant ce code source, il semble que cela ne fait que définir les pages d'erreur par défaut et ne rien configurer avec le ErrorPageFilter
.
J'ai alors mon fichier de configuration d'erreur:
@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {
@Override public void customize( ConfigurableEmbeddedServletContainer container ) {
container.addErrorPages(new ErrorPage( HttpStatus.NOT_FOUND, "/errors/404" ))
}
Cependant, si je viens de visiter une URL invalide et que je DispatcherServlet
ne trouve pas de correspondance, je reçois simplement tomcats /404.html - pas ma vue liée à " /errors/404
" (ce chemin est mappé à un modèle de vue thymeleaf, cela fonctionne bien - si je navigue vers / errors / 404, il affiche ok)
Des idées pour lesquelles ma page d'erreur personnalisée ne fonctionne pas? traçant les journaux, j'obtiens une ligne sur la ErrorPageFilter
configuration et l'installation correctes au démarrage de l'application, mais aucune mention du filtre ne fait quoi que ce soit lorsqu'une demande arrive.
Vous pouvez utiliser le code suivant pour les anciennes versions de spring boot (0.5.x)
public class ServerCustomization extends ServerProperties {
@Override
public void customize(ConfigurableEmbeddedServletContainerFactory factory) {
super.customize(factory);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
"/yourpath/error-not-found.jsp"));
factory.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,
"/yourpath/error-internal.jsp"));
factory.addErrorPages(new ErrorPage("/yourpath/error-other.jsp"));
}
}
Les nouvelles versions de démarrage à ressort (1.X.RELEASE) ont une certaine refactorisation autour de ServerProperties. Voir ci-dessous,
public class ServerCustomization extends ServerProperties {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
super.customize(container);
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
"/jsp/404.jsp"));
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,
"/jsp/500.jsp"));
container.addErrorPages(new ErrorPage("/jsp/error.jsp"));
}
}
Définissez ensuite un bean pour injecter ServerProperies.
@Bean
public ServerProperties getServerProperties() {
return new ServerCustomization();
}
Exemple de projet publié dans git
Très important: si vous utilisez maven pour construire, vous devez stocker tous les fichiers de ressources dans le dossier src / main / resources. Sinon, maven n'ajoutera pas ces fichiers à l'artefact final du jar.