- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SpringBoot搭建全局异常拦截由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
package
com.liqi.web.core.exception;
import
org.springframework.web.bind.annotation.ExceptionHandler;
import
org.springframework.web.bind.annotation.ResponseBody;
import
org.springframework.web.bind.annotation.RestControllerAdvice;
import
com.liqi.common.base.Constants;
import
com.liqi.common.base.ResultBean;
import
com.liqi.common.exception.BusinessInterfaceException;
import
com.liqi.common.exception.bean.ErrorBean;
import
lombok.extern.slf4j.Slf4j;
/**
* 自定义异常处理器
*
* @author ieflex
*/
@RestControllerAdvice
@Slf4j
public
class
InterfaceExceptionHandler {
/**
* 接口 业务异常
*/
@ResponseBody
@ExceptionHandler
(BusinessInterfaceException.
class
)
public
String businessInterfaceException(BusinessInterfaceException e) {
log.error(e.getMessage(), e);
ErrorBean error = e.getError();
ResultBean resultBean =
new
ResultBean(error.hashCode(), error.getErrorMsg());
return
resultBean.toString();
}
/**
* 拦截所有运行时的全局异常
*/
@ExceptionHandler
(RuntimeException.
class
)
@ResponseBody
public
String runtimeException(RuntimeException e) {
log.error(e.getMessage(), e);
// 返回 JOSN
ResultBean resultBean =
new
ResultBean(Constants.INTERFACE_MSG_301, Constants.INTERFACE_MSG_301_TEXT);
return
resultBean.toString();
}
/**
* 系统异常捕获处理
*/
@ExceptionHandler
(Exception.
class
)
@ResponseBody
public
String exception(Exception e) {
log.error(e.getMessage(), e);
ResultBean resultBean =
new
ResultBean(Constants.INTERFACE_MSG_301, Constants.INTERFACE_MSG_301_TEXT);
// 返回 JOSN
return
resultBean.toString();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package
com.springboot_Error.ErrorController;
import
org.springframework.stereotype.Controller;
import
org.springframework.web.bind.annotation.RequestMapping;
@Controller
public
class
ErrorControllerTest {
//全局异常拦截 测试
@RequestMapping
(
"/ErrorTest"
)
public
String index2(){
System.err.println(
"请求成功!"
);
int
i =
1
/
0
;
//这里会有一个运算异常
return
"index"
;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package
com.springboot_Error.ErrorRun;
import
org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import
org.springframework.context.annotation.ComponentScan;
//扫描 com.springboot_Error.ErrorController 包下 controller 注解过的类
@ComponentScan
(basePackages={
"com.springboot_Error.ErrorController"
})
@EnableAutoConfiguration
public
class
ErrorRun {
public
static
void
main(String[] args) {
SpringApplication.run(ErrorRun.
class
, args);
}
}
|
1
2
3
4
5
6
7
8
|
/**
* 功能描述: 模拟自定义异常
* @return
*/
@RequestMapping
(value =
"/api/test"
)
public
Object myext() {
throw
new
BusinessInterfaceException(
"500"
,
"my ext异常"
);
}
|
经过测试发现可以捕获到Controller层的异常,当前前提是Controller层没有对异常进行catch处理,如果Controller层对异常进行了catch处理,那么在这里就不会捕获到Controller层的异常了,所以这一点要注意.
主要是实现ErrorController接口或者继承AbstractErrorController抽象类或者继承BasicErrorController类 。
以下是网上一位博主给出的示例代码,博客地址为:https://blog.csdn.net/king_is_everyone/article/details/53080851 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
@Controller
@RequestMapping
(value =
"error"
)
@EnableConfigurationProperties
({ServerProperties.
class
})
public
class
ExceptionController
implements
ErrorController {
private
ErrorAttributes errorAttributes;
@Autowired
private
ServerProperties serverProperties;
/**
* 初始化ExceptionController
* @param errorAttributes
*/
@Autowired
public
ExceptionController(ErrorAttributes errorAttributes) {
Assert.notNull(errorAttributes,
"ErrorAttributes must not be null"
);
this
.errorAttributes = errorAttributes;
}
/**
* 定义404的ModelAndView
* @param request
* @param response
* @return
*/
@RequestMapping
(produces =
"text/html"
,value =
"404"
)
public
ModelAndView errorHtml404(HttpServletRequest request,
HttpServletResponse response) {
response.setStatus(getStatus(request).value());
Map<String, Object> model = getErrorAttributes(request,
isIncludeStackTrace(request, MediaType.TEXT_HTML));
return
new
ModelAndView(
"error/404"
, model);
}
/**
* 定义404的JSON数据
* @param request
* @return
*/
@RequestMapping
(value =
"404"
)
@ResponseBody
public
ResponseEntity<Map<String, Object>> error404(HttpServletRequest request) {
Map<String, Object> body = getErrorAttributes(request,
isIncludeStackTrace(request, MediaType.TEXT_HTML));
HttpStatus status = getStatus(request);
return
new
ResponseEntity<Map<String, Object>>(body, status);
}
/**
* 定义500的ModelAndView
* @param request
* @param response
* @return
*/
@RequestMapping
(produces =
"text/html"
,value =
"500"
)
public
ModelAndView errorHtml500(HttpServletRequest request,
HttpServletResponse response) {
response.setStatus(getStatus(request).value());
Map<String, Object> model = getErrorAttributes(request,
isIncludeStackTrace(request, MediaType.TEXT_HTML));
return
new
ModelAndView(
"error/500"
, model);
}
/**
* 定义500的错误JSON信息
* @param request
* @return
*/
@RequestMapping
(value =
"500"
)
@ResponseBody
public
ResponseEntity<Map<String, Object>> error500(HttpServletRequest request) {
Map<String, Object> body = getErrorAttributes(request,
isIncludeStackTrace(request, MediaType.TEXT_HTML));
HttpStatus status = getStatus(request);
return
new
ResponseEntity<Map<String, Object>>(body, status);
}
/**
* Determine if the stacktrace attribute should be included.
* @param request the source request
* @param produces the media type produced (or {@code MediaType.ALL})
* @return if the stacktrace attribute should be included
*/
protected
boolean
isIncludeStackTrace(HttpServletRequest request,
MediaType produces) {
ErrorProperties.IncludeStacktrace include =
this
.serverProperties.getError().getIncludeStacktrace();
if
(include == ErrorProperties.IncludeStacktrace.ALWAYS) {
return
true
;
}
if
(include == ErrorProperties.IncludeStacktrace.ON_TRACE_PARAM) {
return
getTraceParameter(request);
}
return
false
;
}
/**
* 获取错误的信息
* @param request
* @param includeStackTrace
* @return
*/
private
Map<String, Object> getErrorAttributes(HttpServletRequest request,
boolean
includeStackTrace) {
RequestAttributes requestAttributes =
new
ServletRequestAttributes(request);
return
this
.errorAttributes.getErrorAttributes(requestAttributes,
includeStackTrace);
}
/**
* 是否包含trace
* @param request
* @return
*/
private
boolean
getTraceParameter(HttpServletRequest request) {
String parameter = request.getParameter(
"trace"
);
if
(parameter ==
null
) {
return
false
;
}
return
!
"false"
.equals(parameter.toLowerCase());
}
/**
* 获取错误编码
* @param request
* @return
*/
private
HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request
.getAttribute(
"javax.servlet.error.status_code"
);
if
(statusCode ==
null
) {
return
HttpStatus.INTERNAL_SERVER_ERROR;
}
try
{
return
HttpStatus.valueOf(statusCode);
}
catch
(Exception ex) {
return
HttpStatus.INTERNAL_SERVER_ERROR;
}
}
/**
* 实现错误路径,暂时无用
* @see ExceptionMvcAutoConfiguration#containerCustomizer()
* @return
*/
@Override
public
String getErrorPath() {
return
""
;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
@Component
@Aspect
public
class
ExceptionAspectController {
public
static
final
Logger logger = LoggerFactory.getLogger(ExceptionAspectController.
class
);
@Pointcut
(
"execution(* com.test.test.*.*(..))"
)
//此处基于自身项目的路径做具体的设置
public
void
pointCut(){}
@Around
(
"pointCut()"
)
public
Object handleControllerMethod(ProceedingJoinPoint pjp) {
Stopwatch stopwatch = Stopwatch.createStarted();
APIResponse<?> apiResponse;
try
{
logger.info(
"执行Controller开始: "
+ pjp.getSignature() +
" 参数:"
+ Lists.newArrayList(pjp.getArgs()).toString());
apiResponse = (APIResponse<?>) pjp.proceed(pjp.getArgs());
logger.info(
"执行Controller结束: "
+ pjp.getSignature() +
", 返回值:"
+ apiResponse.toString());
logger.info(
"耗时:"
+ stopwatch.stop().elapsed(TimeUnit.MILLISECONDS) +
"(毫秒)."
);
}
catch
(Throwable throwable) {
apiResponse = handlerException(pjp, throwable);
}
return
apiResponse;
}
private
APIResponse<?> handlerException(ProceedingJoinPoint pjp, Throwable e) {
APIResponse<?> apiResponse =
null
;
if
(e.getClass().isAssignableFrom(MessageCenterException.
class
) ){
MessageCenterException messageCenterException = (MessageCenterException)e;
logger.error(
"RuntimeException{方法:"
+ pjp.getSignature() +
", 参数:"
+ pjp.getArgs() +
",异常:"
+ messageCenterException.getException().getMessage() +
"}"
, e);
apiResponse = messageCenterException.getApiResponse();
}
else
if
(e
instanceof
RuntimeException) {
logger.error(
"RuntimeException{方法:"
+ pjp.getSignature() +
", 参数:"
+ pjp.getArgs() +
",异常:"
+ e.getMessage() +
"}"
, e);
apiResponse =
new
APIResponse(APIResponse.FAIL,
null
,e.getMessage());
}
else
{
logger.error(
"异常{方法:"
+ pjp.getSignature() +
", 参数:"
+ pjp.getArgs() +
",异常:"
+ e.getMessage() +
"}"
, e);
apiResponse =
new
APIResponse(APIResponse.FAIL,
null
,e.getMessage());
}
return
apiResponse;
}
}
|
到此这篇关于SpringBoot搭建全局异常拦截的文章就介绍到这了,更多相关Springboot全局异常内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/ieflex/article/details/90644976 。
最后此篇关于SpringBoot搭建全局异常拦截的文章就讲到这里了,如果你想了解更多关于SpringBoot搭建全局异常拦截的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
为了构建 CentOS 6.5 OSM 切片服务器,我正在寻找一些文档和/或教程。 我试过this one正如我在我的 previous post 中所说的那样但它适用于 Ubuntu 14.04,而
我正在寻找可用于集成任何源代码控制管理系统的通用 git 桥(如 git-svn、git-p4、git-tfs)模板。 如果没有这样的模板,至少有一些关于如何在 git 端集成基本操作的说明(对于其他
1、前言 redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。 redis有两种高可用的方案: High availabilit
简介 前提条件: 确保本机已经安装 VS Code。 确保本机已安装 SSH client, 并且确保远程主机已安装 SSH server。 VSCode 已经安装了插件 C/
为什么要用ELK ELK实际上是三个工具,Elastricsearch + Logstash + Kibana,通过ELK,用来收集日志还有进行日志分析,最后通过可视化UI进行展示。一开始业务量比
在日常办公当中,经常会需要一个共享文件夹来存放一些大家共享的资料,为了保证文件数据的安全,最佳的方式是公司内部服务器搭建FTP服务器,然后分配多个用户给相应的人员。今天给大家分享FileZilla搭
最近由于业务需要,开始进行 Flutter 的研究,由于 Flutter 的环境搭建在官网上有些细节不是很清楚,笔者重新整理输出 1. 配置镜像 由于在国内访问 Flutter
目录 1. 安装go软件包 2. 配置系统变量 3. 安装git 4. 设置go代理 5. 下载gin框架 6. 创建项目 7.
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任
上篇文章给大家介绍了使用docker compose安装FastDfs文件服务器的实例详解 今天给大家介绍如何使用 docker compose 搭建 fastDFS文件服务器,内容详情如下所示:
目录 1.创建Maven 2.Maven目录和porm.xml配置 3.配置Tomcat服务器 1.创建Maven
laravel 官方提供 homestead 和 valet 作为本地开发环境,homestead 是一个官方预封装的 vagrant box,也就是一个虚拟机,但是跟 docker 比,它占用体积
这个tutorial显示了 Razor Pages 在 Asp.Net Core 2 中的实现。但是,当我运行 CLI 命令时: dotnet aspnet-codegenerator razorp
我创建了一个单独的类库项目来存储数据库上下文和模型类。在同一解决方案中,我创建了一个 ASP.NET MVC 项目并引用了类库项目,并在项目的 Web.config 文件中包含了数据库上下文的连接字符
关于代码托管,公司是基于Gitlab自建的,它功能全而强大,但是也比较重,我个人偏向于开源、小巧、轻便、实用,所以就排除了Github,在Gogs和Gitea中选者。Gogs在Github有38
目录 1、高可用简介 1.1 高可用整体架构 1.2 基于 QJM 的共享存储系统的数据同步机制分析 1.3 NameNode 主
Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。 在高并发连接的情况
对于我们的 ASP.NET Core 项目,我们使用包管理器控制台中的 Scaffold-DbContext 搭建现有数据库。 每次我们做脚手架时,上下文类与所有实体一起生成,它包含调用 option
我正在使用 .net 核心 2.0。我已经安装了以下 nuget 包:1: Microsoft.AspNetCore.All2: Microsoft.EntityFrameworkCore.Tools
我正在使用 NetBeans 及其 RAD 开发功能开发 JEE6 JSF 应用程序。我想使用脚手架来节省更新 Controller 和模型 View 的时间。 OneToMany 关联在 View
我是一名优秀的程序员,十分优秀!