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 处理结果

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

    这里写图片描写叙述

  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7301300.html
Copyright © 2011-2022 走看看