一种:使用@ControllerAdvice和@ExceptionHandler注解
第二种: 使用ErrorController类来实现。
第一种:使用@ControllerAdvice和@ExceptionHandler注解
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
@Slf4j [/b] @ControllerAdvice public class GlobalExceptionHandler { @ResponseBody @ExceptionHandler (NullPointerException. class ) public BaseResult globalException(HttpServletResponse response,NullPointerException ex){ log.info( "GlobalExceptionHandler..." ); log.info( "错误代码:" + response.getStatus()); BaseResult result = new WebResult(WebResult.RESULT_FAIL, "request error:" +response.getStatus() , "GlobalExceptionHandler:" +ex.getMessage()); return result; } } |
注解@ControllerAdvice表示这是一个控制器增强类,当控制器发生异常且符合类中定义的拦截异常类,将会被拦截。
可以定义拦截的控制器所在的包路径
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
@Target ({ElementType.TYPE}) @Retention (RetentionPolicy.RUNTIME) @Documented @Component public @interface ControllerAdvice { @AliasFor ( "basePackages" ) String[] value() default {}; @AliasFor ( "value" ) String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<?>[] assignableTypes() default {}; Class<? extends Annotation>[] annotations() default {}; } |
注解ExceptionHandler定义拦截的异常类
[Java] 纯文本查看 复制代码
1
2
3
4
5
6
|
@Target ({ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) @Documented public @interface ExceptionHandler { Class<? extends Throwable>[] value() default {}; } |
第二种: 使用ErrorController类来实现。
系统默认的错误处理类为BasicErrorController,将会显示如上的错误页面。
这里编写一个自己的错误处理类,上面默认的处理类将不会起作用。
getErrorPath()返回的路径服务器将会重定向到该路径对应的处理类,本例中为error方法。
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
@Slf4j @RestController public class HttpErrorController implements ErrorController { private final static String ERROR_PATH = "/error" ; @ResponseBody @RequestMapping (path = ERROR_PATH ) public BaseResult error(HttpServletRequest request, HttpServletResponse response){ log.info( "访问/error" + " 错误代码:" + response.getStatus()); BaseResult result = new WebResult(WebResult.RESULT_FAIL, "HttpErrorController error:" +response.getStatus()); return result; } @Override public String getErrorPath() { return ERROR_PATH; } } |
测试
以上定义了一个统一的返回类BaseResult,方便前端进行处理。
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
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
|
package com.microblog.common.result; import java.io.Serializable; public class BaseResult implements Serializable { private static final long serialVersionUID = 1L; public static final int RESULT_FAIL = 0 ; public static final int RESULT_SUCCESS = 1 ; //返回代码 private Integer code; //返回消息 private String message; //返回对象 private Object data; public BaseResult(Integer code, String message) { this .code = code; this .message = message; } public BaseResult(Integer code, String message, Object object) { this .code = code; this .message = message; this .data = object; } public Integer getCode() { return code; } public void setCode(Integer code) { this .code = code; } public String getMessage() { return message; } public void setMessage(String message) { this .message = message; } public Object getData() { return data; } public void setData(Object data) { this .data = data; } } |
编写一个测试控制器
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
|
@Slf4j @RestController @RequestMapping ( "/user" ) public class TestController { @RequestMapping ( "/info1" ) public String test(){ log.info( "/user/info1" ); throw new NullPointerException( "TestController have exception" ); } } |
1.发出一个错误的请求,也就是没有对应的处理类。
从返回可以看到是由HttpErrorController类处理
[Java] 纯文本查看 复制代码
1
|
{ "code" : 0 , "message" : "HttpErrorController error:404" , "data" : null } |
2.发出一个正常的请求(TestController的test()处理),处理类中抛出空异样
从返回中可以看出是由GlobalExceptionHandler类处理
[Java] 纯文本查看 复制代码
1
|
{ "code" : 0 , "message" : "request error:200" , "data" : "GlobalExceptionHandler:TestController have exception" } |
更多技术资讯可关注:itheimaGZ获取
来源:https://www.cnblogs.com/zhuxiaopijingjing/p/12293867.html