SpringBoot - @ControllerAdvice的使用详解2(添加全局数据 @ModelAttribute)

二、添加全局数据(搭配 @ModelAttribute)

1,设置全局数据

(1)@ControllerAdvice 是一个全局数据处理组件,因此也可以在 @ControllerAdvice 中配置全局数据,使用 @ModelAttribute 注释进行配置。
(1)这里我们在全局配置中添加了两个方法:

  • message 方法:返回一个 String。
  • userInfo 方法:返回一个 map。

(2)这两个方法有一个注解 @ModelAttribute,其中 value 属性表示这条返回数据的 key,而方法的返回值是返回数据的 value。

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import java.util.HashMap;
import java.util.Map;
 
@ControllerAdvice
public class GlobalConfig {
 
    @ModelAttribute(value = "msg")
    public String message() {
        return "hello index";
    }
 
    @ModelAttribute(value = "info")
    public Map<String, String> userinfo() {
        HashMap<String, String> map = new HashMap<>();
        map.put("name", "小明");
        map.put("age", "25");
        return map;
    }
}

(2)当然 @ModelAttribute 也可以不写 value 参数,直接在方法中对全局 Model 设置 key 和 value。下面代码的效果同上面是一样的:

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import java.util.HashMap;
 
@ControllerAdvice
public class GlobalConfig {
 
    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("msg", "hello index");
 
        HashMap<String, String> map = new HashMap<>();
        map.put("name", "小明");
        map.put("age", "25");
        model.addAttribute("info", map);
    }
}

2,获取全局数据

(1)在任意请求的 Controller 中,方法参数中通过 @ModelAttribute 可以获取指定的全局数据,样例代码如下:
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.Map;
 
@RestController
public class HelloController {
    @GetMapping("/hello1")
    public String hello1(@ModelAttribute("msg") String msg,
                      @ModelAttribute("info") Map<String, String> info) {
        String result = "msg:" + msg + "<br>" + "info:" + info;
        return result;
    }
}

 

(2)我们也可以在请求的 Controller 方法参数中的 Model 获取所有的全局数据,下面代码的结果同上面的一样:
 @GetMapping("/hello2")
    public String hello2(Model model) {
        Map<String, Object> map = model.asMap();
        String msg = map.get("msg").toString();
        Map<String, String> info = (Map<String, String>)map.get("info");
        String result = "msg:" + msg + "<br>" + "info:" + info;
        return result;
    }

 

posted @ 2021-12-14 17:02  山河永慕~  阅读(386)  评论(0编辑  收藏  举报