Spring @ControllerAdvice & @RestControllerAdvice
簡介
- @ControllerAdvice註解是 Spring對控制器進行切面環繞的
- 返回 Json數據時使用 @RestControllerAdvice註釋, 來代替 @ControllerAdvice
參數說明 (默認全包掃描
名稱 | 值 | 說明 |
---|---|---|
value | com.example.controller | 指定包, 即對指定包下的所有 Controller有效 |
basePackages | com.example.controller | 和參數 value相等 |
basePackageClasses | com.example.controller.TestController.class | 指定 Controller類, 掃描範圍爲包括當前類所在包內所有的其它 Controller類 |
assignableTypes | TestController.class | 指定具體的 Controller類 |
annotations | {TestController01.class, TestController02.class} | 可指定一個或多個 Controller類 |
基本使用例子
- 全局數據綁定
@ControllerAdvice(value = "com.example.controller")
public class TestControllerAdvice {
@ModelAttribute("user")
public User getUser() {
User user = new User();
user.setName("全爺");
user.setAge(35);
return user;
}
}
@RestController
public class TestController {
@GetMapping("/index")
public Map<String, Object> index(@ModelAttribute("user") User user) {
final Map<String, Object> result = new HashMap<>();
result.put("name", user.getName());
result.put("age", user.getAge());
return result;
}
}
# 請求地址 http://127.0.0.1:8080/index
# 輸出
{"name":"全爺","age":35}
- 對全局請求數據預處理
public class Car {
private String name;
private String type;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
public class Driver {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
@ControllerAdvice(value = "com.example.controller")
public class TestControllerAdvice {
@InitBinder("c")
public void b(WebDataBinder binder) {
binder.setFieldDefaultPrefix("c.");
}
@InitBinder("d")
public void a(WebDataBinder binder) {
binder.setFieldDefaultPrefix("d.");
}
}
@RestController
public class TestController {
@GetMapping("/index")
public Map<String, Object> index(@ModelAttribute("c") Car car, @ModelAttribute("d") Driver driver) {
final Map<String, Object> result = new HashMap<>();
result.put("Car.name", car.getName());
result.put("Car.type", car.getType());
result.put("Driver.name", driver.getName());
result.put("Driver.age", driver.getAge());
return result;
}
}
# 請求地址 http://127.0.0.1:8080/index?c.name=保時捷&c.type=賽跑&d.name=全爺&d.age=35
# 輸出
{"Driver.age":35,"Car.type":"賽跑","Driver.name":"全爺","Car.name":"保時捷"}
- 全局異常捕獲處理
# 自定義異常
public class CommonException extends RuntimeException {
protected String status;
protected String message;
public CommonException() {}
public CommonException(String status, String msg) {
this.status = status;
this.message = msg;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
# 捕獲指定異常
@RestControllerAdvice(value = "com.example.controller")
public class TestControllerAdvice {
@ExceptionHandler({CommonException.class})
public Map<String, Object> customException(final CommonException e) {
final Map<String, Object> result = new HashMap<>();
result.put("status", e.getStatus());
result.put("message", e.getMessage());
return result;
}
}
@RestController
public class TestController {
@GetMapping("/index")
public Map<String, Object> index() {
if (true) {
throw new CommonException("1000", "拋自定義異常!");
}
return new HashMap<>();
}
}
# 請求地址 http://127.0.0.1:8080/index
# 輸出
{"message":"拋自定義異常!","status":"1000"}
如果您覺得有幫助,歡迎點贊哦 ~ 謝謝!!