zoukankan      html  css  js  c++  java
  • SpringBoot接口服务处理Whitelabel Error Page

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50915979

    1.0 异常说明

    SpringBoot搭建的接口服务。假设请求非注冊类的无效接口地址,则返回该页面。主要问题就是没有对异常请求做处理。

    这里写图片描写叙述

    举例,定义有效接口地址如:http://ip/user, http://ip/age。则其他地址均为无效地址,若请求则返回上述Whitelabel Error Page页面。

    2.0 异常处理

    主要是加入一个AppErrorController的Controller类,这里我定义了异常返回页面。

    package com.autonavi.controller;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.web.ErrorAttributes;
    import org.springframework.boot.autoconfigure.web.ErrorController;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.context.request.RequestAttributes;
    import org.springframework.web.context.request.ServletRequestAttributes;
    import org.springframework.web.servlet.ModelAndView;
    
    
    /**
     * <p>Author: loongshawn
     * <p>Date: 16-03-17
     * <p>Version: 1.0
     */
    @Controller
    public class AppErrorController implements ErrorController{
    
        private static final Logger logger = LoggerFactory.getLogger(AppErrorController.class);
    
        private static AppErrorController appErrorController;
    
         /**
         * Error Attributes in the Application
         */
        @Autowired
        private ErrorAttributes errorAttributes;
    
        private final static String ERROR_PATH = "/error";
    
        /**
         * Controller for the Error Controller
         * @param errorAttributes
         * @return 
         */ 
    
        public AppErrorController(ErrorAttributes errorAttributes) {
            this.errorAttributes = errorAttributes;
        }
    
        public AppErrorController() {
            if(appErrorController == null){
                appErrorController = new AppErrorController(errorAttributes);
            }
        }
    
        /**
         * Supports the HTML Error View
         * @param request
         * @return
         */
        @RequestMapping(value = ERROR_PATH, produces = "text/html")
        public ModelAndView errorHtml(HttpServletRequest request) {
            return new ModelAndView("greeting", getErrorAttributes(request, false));
        }
    
        /**
         * Supports other formats like JSON, XML
         * @param request
         * @return
         */
        @RequestMapping(value = ERROR_PATH)
        @ResponseBody
        public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
            Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request));
            HttpStatus status = getStatus(request);
            return new ResponseEntity<Map<String, Object>>(body, status);
        }
    
        /**
         * Returns the path of the error page.
         *
         * @return the error path
         */
        @Override
        public String getErrorPath() {
            return ERROR_PATH;
        }
    
    
        private boolean getTraceParameter(HttpServletRequest request) {
            String parameter = request.getParameter("trace");
            if (parameter == null) {
                return false;
            }
            return !"false".equals(parameter.toLowerCase());
        }
    
        private Map<String, Object> getErrorAttributes(HttpServletRequest request,
                                                       boolean includeStackTrace) {     
            RequestAttributes requestAttributes = new ServletRequestAttributes(request);       
            Map<String, Object> map = this.errorAttributes.getErrorAttributes(requestAttributes,includeStackTrace);  
            String URL = request.getRequestURL().toString();
            map.put("URL", URL);        
            logger.debug("AppErrorController.method [error info]: status-" + map.get("status") +", request url-" + URL);            
            return map;
        }
    
        private HttpStatus getStatus(HttpServletRequest request) {
            Integer statusCode = (Integer) request
                    .getAttribute("javax.servlet.error.status_code");
            if (statusCode != null) {
                try {
                    return HttpStatus.valueOf(statusCode);
                }
                catch (Exception ex) {
                }
            }
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }   
    
    }

    这个类实现了ErrorController接口,用来处理请求的各种异常。当中定义了一个greeting的html模版,用来显示返回结果。初始化此类模版须要在pom中加入下面依赖:

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    这个依赖主要是给SpringBoot中载入html等类型的模版服务。其支持的模版类型例如以下:

     Template modes:
    [THYMELEAF]     * XHTML
    [THYMELEAF]     * XML
    [THYMELEAF]     * HTML5
    [THYMELEAF]     * LEGACYHTML5
    [THYMELEAF]     * VALIDXHTML
    [THYMELEAF]     * VALIDXML

    SpringBoot项目配置模版路径的方法例如以下:

    1、在main的resources路径下新建templates目录

    这里写图片描写叙述

    2、在templates目录中新建模版文件greeting.html

    <!DOCTYPE HTML>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Error Pages</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
        <p th:text="'Url:' + ${URL}" />
        <p th:text="'Error:' + ${error}" />
        <p th:text="'Status:' + ${status}" />
        <p th:text="'Timestamp:' + ${timestamp}" />
    </body>
    </html>

    3.0 处理结果

    无效请求地址均会返回此页面,仅仅是当中的返回值不同。

    这里写图片描写叙述

  • 相关阅读:
    已解决[Authentication failed for token submission,Illegal hexadecimal charcter s at index 1]
    远程快速安装redis和远程连接
    远程快速安装mysql
    Swiper的jquery动态渲染不能滑动
    微服务架构攀登之路(三)之gRPC入门
    微服务架构攀登之路(二)之RPC
    微服务架构攀登之路(一)之微服务初识
    Go语言中new和make的区别
    Go语言实战爬虫项目
    Go语言系列(十一)- 日志收集系统架构
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7301300.html
Copyright © 2011-2022 走看看