Spring @ControllerAdvice注解

28 篇文章 0 订阅
10 篇文章 0 订阅

Spring @ControllerAdvice & @RestControllerAdvice

简介

  • @ControllerAdvice注解是 Spring对控制器进行切面环绕的
  • 返回 Json数据时使用 @RestControllerAdvice注释, 来代替 @ControllerAdvice

参数说明 (默认全包扫描

名称说明
valuecom.example.controller指定包, 即对指定包下的所有 Controller有效
basePackagescom.example.controller和参数 value相等
basePackageClassescom.example.controller.TestController.class指定 Controller类, 扫描范围为包括当前类所在包内所有的其它 Controller类
assignableTypesTestController.class指定具体的 Controller类
annotations{TestController01.class, TestController02.class}可指定一个或多个 Controller类

基本使用例子

  1. 全局数据绑定

@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}

  1. 对全局请求数据预处理

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":"保时捷"}

  1. 全局异常捕获处理

# 自定义异常
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"}

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值