Maison  >  Article  >  Java  >  contrôle des exceptions Spring Boot 1.5.4

contrôle des exceptions Spring Boot 1.5.4

巴扎黑
巴扎黑original
2017-06-26 11:35:111514parcourir

Spring Boot a implémenté la gestion unifiée des exceptions. Voyons comment personnaliser la gestion des exceptions

Mappage des pages de codes d'erreur

1.1 Page statique

Doit être configuré dans le dossier resources/static/error, nommé d'après le code d'erreur

Ce qui suit est le contenu du 404 page d'erreur, lors de l'accès Lorsqu'un lien n'existe pas, localisez cette page

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Not Found</title></head><body><h1>Sorry, Not Found</h1><p>status code is 404</p></body></html>
Effet d'affichage

1.2 Page de modèle dynamique (l'emplacement de stockage de la page ne peut pas être modifié, et il n'y a que deux noms : 4xx et 5xx)

Exemple ( 5xx.ftl)

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Error</title></head><body><h1>server error</h1><p><div style="color:red;font-size:large">error code: ${status}-${error}</div><div style="color:red;font-size:medium">error msg: ${exception!},${message!}</div><div><div id="trace" style="color:grey;font-size:small;display: none;border: 1px solid black;padding: 10px;">${trace!}</div></div></p></body></html>

Accès intentionnel à une requête qui lève une exception (/test2/throwex)

@Controller
@RequestMapping("/test2")public class Test2 {

    @RequestMapping("")public String index(){return "test";
    }

    @RequestMapping("/throwex")
    @ResponseBodypublic String throwex(){int a = 3;int b=0;return String.valueOf(a/b);
    }
}
Effet de page

Si ajax est utilisé pour accéder à cette demande d'erreur, le message d'erreur représenté par json sera renvoyé

Page de démonstration ( /test2 -> test.ftl)

<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>test</title><script type="text/javascript" src="/js/jquery-2.0.3.min.js?1.1.11"></script></head><body><h1>test page</h1><div><button onclick="doAjax();">请求异常测试</button><div id="msg"></div><textarea id="errorMsg" style="color:red;width: 80%;height:300px"></textarea></div><script type="text/javascript">var doAjax = function () {
        $.ajax({
            url:'/test2/throwex',
            async:true,
            type:'GET',
            data:{},
            dataType:'json',
            success:function (data) {
                $('#msg').text(data);
            },
            error: function(xhr, textStatus, errorThrown) {//                alert(XMLHttpRequest.status);//                alert(XMLHttpRequest.readyState);//                alert(textStatus);                $('#errorMsg').text(xhr.responseText);
            }
        }); 
    };</script></body></html>
Visitez la page de test, cliquez sur le bouton et voyez l'effet comme suit :

Voici les erreurs lors de l'accès à l'aide d'un navigateur Web et d'ajax. L'interface obtient des résultats différents, l'une génère une page d'erreur et l'autre génère une erreur Json, qui est déterminée par le type de réception de la requête.

Accepter :text/html -> Retourner la page d'erreur
Accepter :application/json, text/javascript -> Retourner l'erreur json
L'implémentation spécifique peut être Afficher la classe BasicErrorController

2. Personnaliser le mappage des codes d'erreur sur les pages

2.1 Configuration du mappage des pages statiques (contrôler la relation de mappage des codes d'erreur lorsque personnalisation du conteneur intégré)

@Componentpublic class CustomizationBean implements EmbeddedServletContainerCustomizer{/** * 定制方法一:实现EmbeddedServletContainerCustomizer
     * @param container     */@Overridepublic void customize(ConfigurableEmbeddedServletContainer container) {//container.setPort(9000);    }/** * 定制方法二:注入EmbeddedServletContainerFactory
     * @return */@Beanpublic EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
        factory.setPort(9001);
        factory.setSessionTimeout(10, TimeUnit.MINUTES);//优先级高于配置在/static/error文件夹里面的404.html页面factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/403.html"));return factory;
    }
}

2.2 Configuration du mappage dynamique des pages

@Componentpublic class MyErrorViewResolver  implements ErrorViewResolver {

    @Overridepublic ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {  return new ModelAndView("/error/error",model);}

}

Ce ViewResolver personnalisé remplacera le processeur de page par défaut DefaultErrorViewResolver. La configuration ci-dessus mappe toutes les erreurs (quels que soient les codes d'erreur) à la page d'erreur error.ftl pour une gestion unifiée.

Nouveau contenu d'erreur de rendu de la page error.ftl

Configuration similaire à 5xx.ftl

3. Quelques configurations anormales

> ; L'attribut d'erreur renvoie le modèle)-> Jetez-le au processeur de page ErrorViewResolver
#BasicErrorController的请求路径(你可以遇到错误后跳转的路径,该路径是一个BasicErrorController的请求路径,映射到它errorHtml或者error方法,由请求接受类型决定,一个返回错误页面,一个返回错误json)
#server.error.path=/error
#always include stacktrace(是否包含异常的堆栈信息,默认NEVER,页面无法获取到${trace!}的值,可取值NEVER,ALWAYS,ON_TRACE_PARAM; on_trace_param意思是请求带上参数 ?trace=true)
<em>server.error.include-stacktrace=always<br><br><br></em>

afin que vous puissiez personnaliser le contrôleur/personnaliser

ErrorAttributes/Customization

ErrorViewResolver, etc., pour obtenir une gestion des exceptions plus complexe

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn