ControllerAdvice Spring全局异常处理

ControllerAdvice作用

使用@ControllerAdvice能够在不侵入业务逻辑的情况下,进行业务异常的处理,尤其是针对于业务处理时,需要用异常的方式向前台传输异常编码的情况下,用@ControllerAdvice能够非常完美的实现异常的处理。

ControllerAdvice代码实现

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
/**
*
* Description:
*
* Created on 2017年2月23日
*
* @author jinyanan
* @version 1.0
* @since v1.0
*/
@ControllerAdvice
public class ApplicationControllerExceptionHandler {

/**
* logger
*/
private static Room1000Logger logger = Room1000Logger.getLogger(ApplicationControllerExceptionHandler.class);

/**
*
* Description: 针对BaseAppException类型的异常,该异常一般为业务抛出的异常,主要用于向前台传输异常信息
*
* @author jinyanan
*
* @param ex 抛出的异常
* @return Map<String, Object> 向前台返回的参数,会以JSON的形式返回
*/
@ExceptionHandler(value = BaseAppException.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public Map<String, Object> handlerError(BaseAppException ex) {
logger.error(ex.getMessage(), ex);
Map<String, Object> map = new HashMap<String, Object>();
map.put("errorCode", ex.getCode());
map.put("errorMsg", ex.getLocaleMessage());
return map;
}

/**
*
* Description: 除了BaseAppException类型之外的异常,该异常一般为内部实现出错时会抛出的异常,例如NummPointerException、SQLException等等,非业务逻辑异常
*
* @author jinyanan
*
* @param ex 抛出的异常
* @return Map<String, Object> 向前台返回的参数,会以JSON的形式返回
*/
@ExceptionHandler(value = Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public Map<String, Object> handlerError(Exception ex) {
logger.error(ex.getMessage(), ex);
Map<String, Object> map = new HashMap<String, Object>();
map.put("errorMsg", ex.getMessage());
return map;
}

}

注意点:

  1. 类名上要加上@ControllerAdvice注解,用于声明该类是用来全局异常处理的。
  2. 方法上要使用以下3个注解@ExceptionHandler@ResponseStatus@ResponseBody。其中@ExceptionHandler用来声明该方法是用来拦截那种异常的;@ResponseStatus是用来向前台返回何种http异常码;@ResponseBody用来声明返回体。
  3. 该类中的方法的返回值、方法名、方法参数没有固定的格式,可以自定义,只要只不过方法参数中一般至少会带一个异常,因为返回值中一般会根据异常中的信息进行返回。

Controller代码实现

@Controller类无需特殊处理,还是普通的代码处理方式,我最开始就是以为Controller类中的各个方法上也要带上@ExceptionHandler注解,导致晚上失眠,始终想不通到底哪里出问题了。
这里放一个我的代码

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
/**
*
* Description:
*
* Created on 2017年1月24日
*
* @author jinyanan
* @version 1.0
* @since v1.0
*/
@Api(value = "attr", description = "attr 接口API")
@RestController
@RequestMapping("/api/v1/jyn/attr")
public class AttrController {

/**
* attrService
*/
@Autowired
public IAttrService attrService;

/**
*
* Description:
*
* @author jinyanan
*
* @return List<AttrDto>
* @throws BaseAppException
*/
@RequestMapping(value = "", method = RequestMethod.GET)
@ApiOperation(value = "查询所有Attr")
public List<AttrDto> getAllAttr() throws BaseAppException {
List<AttrDto> attrList = attrService.qryAllAttr();
if (attrList == null) {
throw new BaseAppException("ErrorCode");
}
return attrList;
}

}

 

注意点:

  1. 当前代码中,抛异常的位置是放在Controller层的,其实在Service层抛出异常一样会被Spring全局异常捕获的,不用担心。

返回信息展示

下图是使用SwaggerUI进行展示的,至于如何使用的,请自行Google或百度

SpringMVC url中接收中文参数乱码解决方案
posted @ 2019-07-31 16:20  qxwang  阅读(50)  评论(0)    收藏  举报