3.17.5 @RestControlleradvice注解

3.17.5 @RestControlleradvice注解

org.springframework.web.bind.annotation.RestControlleradvice注解本身使用@ControllerAdvice@ResponseBody注解。使用了@RestControllerAdvice注解的类会被看作一个ControllerAdvice,而该类中所有使用@ExceptionHandler注解的方法都默认使用@ResponseBody注解。
@RestControllerAdvice注解的源代码如下:

1
2
3
4
5
6
7
8
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice{
//....
}

示例 @RestControllerAdvice注解的使用

创建一个RestControllerAdviceTest项目,所有文件和配置基本和3.17.3节的RestControllerAdviceTest项目一致。

GlobalExceptionHandler.java

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
package org.fkit.controller;

import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
* @RestController注解本身使用@ControllerAdvicer@ResponseBody注解。
* 使用了@RestControllerAdvice注解的类会被看作一个ControllerAdvicer,
* 而该类中所有使用@ExceptionHandler注解的方法都默认使用了的@ResponseBody注解。
*/
@RestControllerAdvice
public class GlobalExceptionHandler
{
// 处理OrderException自定义异常
@ExceptionHandler(value = OrderException.class)
// 默认使用了的@ResponseBody注解,会将方法返回的Map转换为JSON数据发送给浏览器
public Object OrderErrorHandler(Exception e) throws Exception
{
// 创建返回对象Map并设置属性,会被@ResponseBody注解转换为JSON返回
Map<String, Object> map = new HashMap<>();
map.put("code", 100);
map.put("message", e.getMessage());
map.put("data", "请求失败");
return map;
}
}

GlobalExceptionHandler使用了@RestControllerAdvice注解,该类会被看成一个ControllerAdvice,同时该类中所有使用@ExceptionHandler注解的方法都默认使用了@ResponseBody注解, OrderErrorHandler方法会将Map集合数据转换成JSON格式并返回客户端。
测试结果和ControllerAdviceTest项目的测试结果一致,此处不再赘述。