配置springboot在访问404时自定义返回结果以及统一异常处理

在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息。

如下是springBoot自带的错误结果信息:

1 {
2   "timestamp": 1492063521109,
3   "status": 404,
4   "error": "Not Found",
5   "message": "No message available",
6   "path": "/rest11/auth"
7 }

 

百度一波,发现需要配置文件中加上如下配置:

properties格式:

#出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
#不要为我们工程中的资源文件建立映射
spring.resources.add-mappings=false

yml格式:

spring:
#出现错误时, 直接抛出异常(便于异常统一处理,否则捕获不到404)mvc:throw-exception-if-no-handler-found: true#不要为我们工程中的资源文件建立映射resources:add-mappings: false

   

下面是我SpringMVC-config配置代码,里面包含统一异常处理代码,都贴上:

  

  1 package com.qunyi.jifenzhi_zx.core.config;
  2 
  3 import com.alibaba.druid.pool.DruidDataSource;
  4 import com.alibaba.druid.support.http.StatViewServlet;
  5 import com.alibaba.druid.support.http.WebStatFilter;
  6 import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator;
  7 import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
  8 import com.alibaba.fastjson.JSON;
  9 import com.alibaba.fastjson.serializer.SerializerFeature;
 10 import com.alibaba.fastjson.support.config.FastJsonConfig;
 11 import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
 12 import com.qunyi.jifenzhi_zx.core.Const;
 13 import com.qunyi.jifenzhi_zx.core.base.exception.ServiceException;
 14 import com.qunyi.jifenzhi_zx.core.base.result.ResponseMsg;
 15 import com.qunyi.jifenzhi_zx.core.base.result.Result;
 16 import org.slf4j.Logger;
 17 import org.slf4j.LoggerFactory;
 18 import org.springframework.beans.factory.annotation.Value;
 19 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 20 import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
 21 import org.springframework.boot.web.servlet.ServletRegistrationBean;
 22 import org.springframework.context.annotation.Bean;
 23 import org.springframework.context.annotation.Configuration;
 24 import org.springframework.http.converter.HttpMessageConverter;
 25 import org.springframework.web.context.request.RequestContextListener;
 26 import org.springframework.web.method.HandlerMethod;
 27 import org.springframework.web.servlet.HandlerExceptionResolver;
 28 import org.springframework.web.servlet.ModelAndView;
 29 import org.springframework.web.servlet.NoHandlerFoundException;
 30 import org.springframework.web.servlet.config.annotation.CorsRegistry;
 31 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 32 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 33 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 34 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 35 
 36 import javax.servlet.http.HttpServletRequest;
 37 import javax.servlet.http.HttpServletResponse;
 38 import java.io.IOException;
 39 import java.nio.charset.Charset;
 40 import java.util.List;
 41 
 42 /**
 43  * Spring MVC 配置
 44  *
 45  * @author xujingyang
 46  * @date 2018/05/25
 47  */
 48 @Configuration
 49 public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
 50 
 51     private final Logger logger = LoggerFactory.getLogger(WebMvcConfigurer.class);
 52     @Value("${spring.profiles.active}")
 53     private String env;//当前激活的配置文件
 54 
 55     //使用阿里 FastJson 作为JSON MessageConverter
 56     @Override
 57     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
 58         FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
 59         FastJsonConfig config = new FastJsonConfig();
 60         config.setSerializerFeatures(SerializerFeature.WriteMapNullValue,//保留空的字段
 61                 SerializerFeature.WriteNullStringAsEmpty,//String null -> ""
 62                 SerializerFeature.WriteNullNumberAsZero);//Number null -> 0
 63         converter.setFastJsonConfig(config);
 64         converter.setDefaultCharset(Charset.forName("UTF-8"));
 65         converters.add(converter);
 66     }
 67 
 68 
 69     //统一异常处理
 70     @Override
 71     public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
 72         exceptionResolvers.add(new HandlerExceptionResolver() {
 73             public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {
 74                 ResponseMsg result;
 75                 if (e instanceof ServiceException) {//业务失败的异常,如“账号或密码错误”
 76                     result = new ResponseMsg("501", "业务层出错:" + e.getMessage());
 77                     logger.info(e.getMessage());
 78                 } else if (e instanceof NoHandlerFoundException) {
 79                     result = new ResponseMsg("404", "接口 [" + request.getRequestURI() + "] 不存在");
 80                 } else {
 81                     result = new ResponseMsg("500", "接口 [" + request.getRequestURI() + "] 错误,请联系管理员!");
 82                     String message;
 83                     if (handler instanceof HandlerMethod) {
 84                         HandlerMethod handlerMethod = (HandlerMethod) handler;
 85                         message = String.format("接口 [%s] 出现异常,方法:%s.%s,异常摘要:%s",
 86                                 request.getRequestURI(),
 87                                 handlerMethod.getBean().getClass().getName(),
 88                                 handlerMethod.getMethod().getName(),
 89                                 e.getMessage());
 90                     } else {
 91                         message = e.getMessage();
 92                     }
 93                     logger.error(message, e);
 94                 }
 95                 responseResult(response, result);
 96                 return new ModelAndView();
 97             }
 98 
 99         });
100     }
101 
102     //解决跨域问题
103     @Override
104     public void addCorsMappings(CorsRegistry registry) {
105         registry.addMapping("/**") // **代表所有路径
106                 .allowedOrigins("*") // allowOrigin指可以通过的ip,*代表所有,可以使用指定的ip,多个的话可以用逗号分隔,默认为*
107                 .allowedMethods("GET", "POST", "HEAD", "PUT", "DELETE") // 指请求方式 默认为*
108                 .allowCredentials(false) // 支持证书,默认为true
109                 .maxAge(3600) // 最大过期时间,默认为-1
110                 .allowedHeaders("*");
111     }
112 
113     //添加拦截器
114     @Override
115     public void addInterceptors(InterceptorRegistry registry) {
116         //接口登录验证拦截器
117         if (!"dev".equals(env)) { //开发环境忽略登录验证
118             registry.addInterceptor(new HandlerInterceptorAdapter() {
119                 @Override
120                 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
121                     //验证登录
122                     Object obj = request.getSession().getAttribute(Const.LOGIN_SESSION_KEY);
123                     if (obj != null) {
124                         return true;
125                     } else {
126                         logger.warn("请先登录!==> 请求接口:{},请求IP:{},请求参数:{}",
127                                 request.getRequestURI(), getIpAddress(request), JSON.toJSONString(request.getParameterMap()));
128 
129                         responseResult(response, new ResponseMsg(Result.SIGNERROR));
130                         return false;
131                     }
132                 }
133             });
134         }
135     }
136 
137 
138     private void responseResult(HttpServletResponse response, ResponseMsg result) {
139         response.setCharacterEncoding("UTF-8");
140         response.setHeader("Content-type", "application/json;charset=UTF-8");
141         response.setStatus(200);
142         try {
143             response.getWriter().write(JSON.toJSONString(result));
144         } catch (IOException ex) {
145             logger.error(ex.getMessage());
146         }
147     }
148 
149     private String getIpAddress(HttpServletRequest request) {
150         String ip = request.getHeader("x-forwarded-for");
151         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
152             ip = request.getHeader("Proxy-Client-IP");
153         }
154         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
155             ip = request.getHeader("WL-Proxy-Client-IP");
156         }
157         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
158             ip = request.getHeader("HTTP_CLIENT_IP");
159         }
160         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
161             ip = request.getHeader("HTTP_X_FORWARDED_FOR");
162         }
163         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
164             ip = request.getRemoteAddr();
165         }
166         // 如果是多级代理,那么取第一个ip为客户端ip
167         if (ip != null && ip.indexOf(",") != -1) {
168             ip = ip.substring(0, ip.indexOf(",")).trim();
169         }
170 
171         return ip;
172     }
173 
174 
175     /**
176      * druidServlet注册
177      */
178     @Bean
179     public ServletRegistrationBean druidServletRegistration() {
180         ServletRegistrationBean registration = new ServletRegistrationBean(new StatViewServlet());
181         registration.addUrlMappings("/druid/*");
182         return registration;
183     }
184 
185     /**
186      * druid监控 配置URI拦截策略
187      *
188      * @return
189      */
190     @Bean
191     public FilterRegistrationBean druidStatFilter() {
192         FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
193         // 添加过滤规则.
194         filterRegistrationBean.addUrlPatterns("/*");
195         // 添加不需要忽略的格式信息.
196         filterRegistrationBean.addInitParameter("exclusions", "/web_frontend/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid,/druid/*,/error,/login*");
197         // 用于session监控页面的用户名显示 需要登录后主动将username注入到session里
198         filterRegistrationBean.addInitParameter("principalSessionName", "username");
199         return filterRegistrationBean;
200     }
201 
202 
203     /**
204      * druid数据库连接池监控
205      */
206     @Bean
207     public DruidStatInterceptor druidStatInterceptor() {
208         return new DruidStatInterceptor();
209     }
210 
211     /**
212      * druid数据库连接池监控
213      */
214     @Bean
215     public BeanTypeAutoProxyCreator beanTypeAutoProxyCreator() {
216         BeanTypeAutoProxyCreator beanTypeAutoProxyCreator = new BeanTypeAutoProxyCreator();
217         beanTypeAutoProxyCreator.setTargetBeanType(DruidDataSource.class);
218         beanTypeAutoProxyCreator.setInterceptorNames("druidStatInterceptor");
219         return beanTypeAutoProxyCreator;
220     }
221 
222     /**
223      * RequestContextListener注册
224      */
225     @Bean
226     public ServletListenerRegistrationBean<RequestContextListener> requestContextListenerRegistration() {
227         return new ServletListenerRegistrationBean<>(new RequestContextListener());
228     }
229 
230     /**
231      * 将swagger-ui.html 添加 到 resources目录下
232      *
233      * @param registry
234      */
235     @Override
236     public void addResourceHandlers(ResourceHandlerRegistry registry) {
237         registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
238         registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
239         registry.addResourceHandler("/web_frontend/**").addResourceLocations("classpath:/web_frontend/");
240 
241     }
242 
243 }
View Code

 

  

  至此,所有错误异常都能捕捉到,统一处理了~~

 

转载于:https://www.cnblogs.com/xujingyang/p/9103554.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx配置php 9000,Nginx支持php配置

Nginx本身是不支持对外部程序的直接调用或者解析&#xff0c;所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux 下是socket&#xff0c;(这个socket可以是文件socket&#xff0c;也可以是ip socket)。为了调用CGI程序&#xff0c;还需要一个FastCGI的wra…

ansible 判断和循环

标准循环 模式一 - name: add several usersuser: name{{ item }} statepresent groupswheelwith_items:- testuser1- testuser2 orwith_items: "{{ somelist }}" 模式2. 字典循环- name: add several usersuser: name{{ item.name }} statepresent groups{{ item.g…

php require 500,thinkphp5出现500错误怎么办

thinkphp5出现500错误&#xff0c;如下图所示&#xff1a;require(): open_basedir restriction in effect. File(/home/wwwroot/pic/thinkphp/start.php) is not within the allowed解决方法&#xff1a;1、我是lnmp1.4 php5.6&#xff0c;php.ini里面的open_basedir 是注释掉…

如何创建路径别名

在访问页面时&#xff0c;页面地址会以 DocumentRoot所指定的路径为相对路径&#xff0c;但若不想使用指定的路径&#xff0c;则需要创建路径别名。假如DocumentRoot为/var/www/html &#xff0c;现想将/var/www/html/mail 建立别名/web/mail&#xff0c;该如何修改呢&#xff…

33 -jQuery 属性操作,文档操作(未完成)

转载于:https://www.cnblogs.com/venicid/p/9110130.html

Robot Framework + Selenium library + IEDriver环境搭建

转载&#xff1a;https://www.cnblogs.com/Ming8006/p/4998492.html#c.d 目录&#xff1a; 1 安装文件准备2 Robot框架结构3 环境搭建 3.1 安装Python 3.2 安装Robot Framework 3.3 安装wxPython 3.4 安装RIDE 3.5 安装Selenium2Library 3.6 安装IEDriverServer 1 安装文…

php静态地图api,静态图API | 百度地图API SDK

百度地图静态图API&#xff0c;可实现将百度地图以图片形式嵌入到您的网页中。您只需发送HTTP请求访问百度地图静态图服务&#xff0c;便可在网页上以图片形式显示您的地图。静态图API较之JavaScript API载入的动态网站&#xff0c;既能满足基本的地图信息浏览&#xff0c;又能…

[XMOVE自主设计的体感方案] XMove Studio管理系统(二)应用开发API简要介绍

一. XMove的开放式应用开发框架简介 XMove4.0以开放式的结构满足扩展性的要求。所有无线协议&#xff0c;底层算法和控制逻辑全部上移到PC端。节点只根据接受的控制逻辑返回传感器数据。新的架构使得开发新应用非常方便。 本节将主要介绍XMove应用开发API及其使用。 二. 注册新…

搭建服务器Apache+PHP+MySql需要注意的问题

参见https://www.cnblogs.com/bytebull/p/7927542.html 一、软件下载的都是用zip压缩文件&#xff0c;三个软件均需手动配置&#xff0c;若想省事&#xff0c;可考虑phpstudy&#xff0c;一键安装。 我的服务器文件目录&#xff1a; 二、安装PHP时需注意&#xff0c;新版本的PH…

php行为日志,利用ThinkPHP的行为扩展做系统日志

1&#xff1a;模块配置&#xff1a;return array(action_end > array(Admin\\Behaviors\\LogBehavior),);2&#xff1a;数据库建表&#xff1a;create table logs(id int(11) primary key auto_increment,url char(30) not null,operator int(11) not null,description char…

nagios搭建(一):nagios3.2的搭建

此文章的大多地方采用的是elain的博客内容&#xff1a;http://elain.blog.51cto.com/3339379/711549小部分内容是自己的从别的文章总结过来的&#xff0c;已经试验过了1.需要的软件包&#xff1a;nagios-3.2.0.tar.gz nagios的主软件包nagios-cn-3.2.0.tar.…

0530JavaScript基础2

常用内置对象 所谓内置对象就是ECMAScript提供出来的一些对象&#xff0c;我们知道对象都是有相应的属性和方法 数组Array&#xff08;部分相当于列表&#xff09; 1.数组的创建方式 var colors [red,color,yellow]; 使用构造函数&#xff08;后面会讲&#xff09;的方式创建 …

.net mvc 超过了最大请求长度 限制文件上传大小

在我们的项目中遇到"超过了最大请求长度"如下图所示,是因为IIS默认请求长度4M,当请求长度大于这个值的时候报错,下面是解决方案. 解决方案:修改web.config文件 1、注意在mvc中有两个web.config文件&#xff0c;如下图&#xff0c;一个位于Views下&#xff0c;是用来控…

分布式之缓存击穿

什么是缓存击穿 在谈论缓存击穿之前&#xff0c;我们先来回忆下从缓存中加载数据的逻辑&#xff0c;如下图所示 因此&#xff0c;如果黑客每次故意查询一个在缓存内必然不存在的数据&#xff0c;导致每次请求都要去存储层去查询&#xff0c;这样缓存就失去了意义。如果在大流量…

(转)VS2010 快捷键

之前写代码很少用到快捷键&#xff0c;感觉用鼠标也一样&#xff0c;但是还是觉得能熟练用快捷键的人很牛一样的&#xff0c;相信很多人也有我一样的想法的&#xff0c;现在我还是觉得记些快捷键还是很有必要的(或者是为了看起来更牛点吧 )&#xff0c; 所以这样转载下VS2010快…

arcgis建立拓扑分析(检验矢量图)

目的&#xff1a;矢量图画好后&#xff0c;检查是否有伪节点&#xff0c;悬挂节点等&#xff0c;线要素和面要素都可以检查。伪节点&#xff0c;两条线应该相交但是画的没相交&#xff1b;悬挂节点&#xff0c;两条线看似相交了但是没有节点&#xff0c;因此路径不同&#xff0…

oracle11g导出dmp文件 少表,Oracle11g导出dmp并导入Oracle10g的操作记录

Oracle11g导出dmp并导入Oracle10g的操作记录。操作环境说明&#xff1a;Oracle11g环境&#xff1a;Windows7&#xff0c;Oracle Database 11g Enterprise Edition Release 11.2.0.1.0&#xff0c;ZHS16GBK。Oracle10g环境&#xff1a;中标麒麟&#xff0c;Oracle Database 10g …

完整国内城市js级联选择

js代码: View Code var china [//直辖市[北京市],[上海市],[天津市],[重庆市],//华北地区[河北省,石家庄,唐山,秦皇岛,邯郸,邢台,保定,张家口,承德,沧州,廊坊,衡水],[山西省,太原,大同,阳泉,长治,晋城,朔州,晋中,运城,忻州,临汾,吕梁],[内蒙古自治区,呼和浩特,包头,乌海,赤峰…

302重定向问题

在把原有的项目迭代以后出现了访问原有域名&#xff1a; abc.dex 不能访问的情况&#xff08;注意&#xff1a;这种情况时而能访问&#xff0c;时而不能访问&#xff09; 必须访问&#xff1a;abc.dex /login.index才能登陆 下面是抓取网络状态的截图&#xff1a; SLB在做…

2017级面向对象程序设计——团队作业1

这是一股来自青青草原的神秘力量 团队信息 团队名称 青青草原战队队伍成员 阮君曦 031702116(队长)史恩泽 031702122蓝飞鹏 031702112张凌昕 031702105林鑫 031702138团队合照人物属性 阮君曦&#xff08;懒羊羊&#xff09; 风格&#xff1a; 一旦进入学习状态便一发不可收拾。…