统⼀异常处理@ExceptionHandler
⼀、如何设置全局的异常处理
⽤@RequestBody,@ResponBody,不费吹灰之⼒就解决了JSon⾃动绑定。
接着就发现,如果遇到RuntimeException,需要给出⼀个默认返回JSON,有以下三种⽅式:
1.当这个Controller中任何⼀个⽅法发⽣异常,⼀定会被这个⽅法拦截到。然后,输出⽇志。封装Map并返回,页⾯上得到status为fal。
代码如下:
1@Controller
2publicclassAccessController{
3
4/**
5*异常页⾯控制
6*
7*@paramruntimeException
8*@return
9*/
10@ExceptionHandler()
11public@ResponBody
12Map
(alizedMessage());
14
15Mapmodel=newTreeMap();
("status",fal);
17returnmodel;
18}
19
20}
2.返回到错误界⾯
代码如下:
1@Controller
2publicclassAccessController{
3/**
4*异常页⾯控制
5*
6*@paramruntimeException
7*@return
8*/
9@ExceptionHandler()
10publicStringruntimeExceptionHandler(RuntimeExceptionruntimeException,
11ModelMapmodelMap){
(alizedMessage());
13
("status",_STATUS);
15return"exception";
16}
17}
3.使⽤@ControllerAdvice,不⽤任何的配置,只要把这个类放在项⽬中,Spring能扫描到的地⽅。就可以实现全局异常的回调。
代码如下:
@ControllerAdvice
publicclassSpringExceptionHandler{
/**
*全局处理Exception
*错误的情况下返回500
*@paramex
*@paramreq
*@return
*/
@ExceptionHandler(value={})
publicResponEntity
TResulttResult=newTResult();
tus(CodeType.V_500);
orMessage(sage());
returnnewResponEntity
}
}
⼆、@ExceptionHandler注解
直接在Controller⾥⾯加上⽤@ExceptionHandler标注⼀个处理异常的⽅法像下⾯这样⼦
这样,Controller⾥⾯的⽅法抛出了MissingServletRequestParameterException异常就会执⾏上⾯的这个⽅法来进⾏异常处理。
如下⾯的代码:
如果我没有传⼊id值,那么就会抛出MissingServletRequestParameterException的异常,就会被上⾯的异常处理⽅法处理。
上⾯的@ExceptionHandler()这个注解的value的值是⼀个Class[]类型的,这⾥的
ExceptionClass是你⾃⼰指定的,你也可以指定多个需要处理的异常类型,⽐如这样@ExceptionHandler(value=
{,}),这样就会处理多个异常了。
但这个只会是在当前的Controller⾥⾯起作⽤,如果想在所有的Controller⾥⾯统⼀处理异常的话,可以⽤@ControllerAdvice来创建⼀个专门
处理的类。如⼀中的3所述。
三、@ControllerAdvice注解
@ControllerAdvice,是Spring3.2提供的新注解,从名字上可以看出⼤体意思是控制器增强。让我们先看看@ControllerAdvice的实现:
没什么特别之处,该注解使⽤@Component注解,这样的话当我们使⽤
再⼀起看看官⽅提供的comment。
⼤致意思是:
@ExceptionHandler()
@ResponStatus(_REQUEST)
publicvoidprocessMethod(MissingServletRequestParameterExceptionex,HttpServletRequestrequest,HttpServletResponrespon)throwsIOExceptio
n("抛异常了!"+alizedMessage());
("抛异常了!"+alizedMessage());
ter().printf(sage());
uffer();
}
1
2
3
4
5
6
7
8
@RequestMapping("/index")
publicStringindex(@MyUrUrur,@RequestParamStringid,ModelMapmodelMap){
return"login";
}
1
2
3
4
@ControllerAdvice是⼀个@Component,⽤于定义@ExceptionHandler,@InitBinder和@ModelAttribute⽅法,适⽤于所有使⽤
@RequestMapping⽅法。
Spring4之前,@ControllerAdvice在同⼀调度的Servlet中协助所有控制器。Spring4已经改变:@ControllerAdvice⽀持配置控制器的⼦
集,⽽默认的⾏为仍然可以利⽤。
在Spring4中,@ControllerAdvice通过annotations(),baPackageClass(),baPackages()⽅法定制⽤于选择控制器⼦集。
不过据经验之谈,只有配合@ExceptionHandler最有⽤,其它两个不常⽤。
在我们提到,如果单使⽤@ExceptionHandler,只能在当前Controller中处理异常。但当配合@ControllerAdvice⼀起使⽤的时候,就可以摆
脱那个限制了。
如果我们想定义⼀个处理全局的异常
乍⼀眼看上去毫⽆问题,但这⾥有⼀个纰漏,由于Exception是异常的⽗类,如果你的项⽬中出现过在⾃定义异常中使⽤@ResponStatus
的情况,你的初衷是碰到那个⾃定义异常响应对应的状态码,⽽这个控制器增强处理类,会⾸先进⼊,并直接返回,不会再有
@ResponStatus的事情了,这⾥为了解决这种纰漏,我提供了⼀种解决⽅式。
如果碰到了某个⾃定义异常加上了@ResponStatus,就继续抛出,这样就不会让⾃定义异常失去加上@ResponStatus的初衷。
@Controller
@RequestMapping(value="exception")
publicclassExceptionHandlerController{
@RequestMapping(value="e2/{id}",method={})
@ResponBody
publicStringtestExceptionHandle2(@PathVariable(value="id")Integerid){
List
(id-1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
本文发布于:2022-12-26 14:12:58,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/34154.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |