Spring boot ---@ContollerAdvice

@ControllerAdvice 相当于 @Controller  的增强版,@Controller Advice 通常是用来处理全局数据的

在使用的时候一般是结合 @ExceptionHandler 、@ModelAttribute 、 @InitBinder 使用

@ControolerAdvice 跟 @ExceptionHandler 结合使用

@ExceptionHandler 是用来处理全局的异常,当发生指定的异常的时候,如果跟@ExceptionHandler中定义的异常一致们就会指定该方法中的内容,可以返回json 也可以返回ModeAndView 视图

@ControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(Exception.class)

表示 当 出现Exception 异常的时候,就会执行对应的方法  (使用json )

   @ExceptionHandler(Exception.class)
    public void uploadExcption(Exception e, HttpServletResponse response) throws IOException {
        response.setContentType(e.toString());
        PrintWriter writer = response.getWriter();
        writer.write("发生异常");
        writer.flush();
        writer.close();
    }

执行 ModelandView 视图

 @ExceptionHandler(Exception.class)
    public ModelAndView uploadExceptionModeAndView(Exception e, HttpServletResponse response) {
        ModelAndView view = new ModelAndView();
        view.setViewName("error");
        view.addObject("msg", "发僧错误:" + e.toString());
        return view;
    }

在使用的时候,可以创建跟返回名称一致的视图,

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymelefaf.org">
<head>
    <meta charset="UTF-8">
    <title>错误视图</title>
</head>
<body>
    <div th:text="${msg}"></div>
</body>
</html>

@ControllerAdvice 跟  @ModelAttribute 的使用

@ModelAttribute 用于在所有的请求之前执行,在当前类所有的请求之前执行

   /**
     * 会在下面所有请求方式方法执行前执行
     * 返回时的key--value 的形式 其中 key 表示的name 的值  value  是返回的数据
     *
     * @return
     */
    @ModelAttribute(name = "info")
    public Map<String, Object> modelAttributeInfo() {
        Map<String, Object> map = new HashMap<>();
        map.put("name", "miao");
        map.put("sex", "nv");
        return map;
    }

在获取的时候,需要使用到 model 进行数据的获取

  /**
     * @param model  用于获取 被 @ModelAttribute 所修饰的方法
     */
    @RequestMapping("/hello")
    @ResponseBody
    public void hello(Model model) {
        Map<String, Object> stringObjectMap = model.asMap();
        Iterator<String> iterator = stringObjectMap.keySet().iterator();
        while (iterator.hasNext()) {
            // 获取的是 key 的值
            String next = iterator.next();
            Object value = stringObjectMap.get(next);
            System.out.println(value);
        }
    }

@ControllerAdvice 跟 @InitBander   

@InitBander  表示的是 请求参数处理,即将表单中的数据绑定到实体类上时进行一些额外的处理

   其中用到的一个类:   WebDataBinder  该类用于操作  从Web请求参数到JavaBean对象的数据绑定  专为Web环境而设计,但不依赖于Servlet API; 

 @InitBinder("a")
    public void init(WebDataBinder webDataBinder) {
        webDataBinder.setFieldDefaultPrefix("a.");
        webDataBinder.setBindEmptyMultipartFiles(true);
        webDataBinder.setFieldMarkerPrefix("");
    }

    @InitBinder("b")
    public void init2(WebDataBinder webDataBinder) {
        webDataBinder.setFieldDefaultPrefix("b.");
    }

名称为 a 、b  可以引用使用

    /**
     *  结合  InitBinder 和  ModelAttribute  使用
     * @param book
     * @param author
     * @return
     */
    @GetMapping("/book")
    @ResponseBody
    public String book(@ModelAttribute("b") Book book,
                       @ModelAttribute("a") Author author) {

        return "";
    }

在传递参数的时候,使用的是  a.  则表示 将数据 放到  @ModelAttribute("a")   引用的 实体类中

例如:

http://localhost:8080/book?b.name= "123"&b.sex="nv"&a.name="12321"

会将不同的数据放到对应的实体中

其中用到的WebDataBinder  类中  包含三个set 方法,

引用网址:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/WebDataBinder.html

voidsetBindEmptyMultipartFiles(boolean bindEmptyMultipartFiles)

设置是否绑定空的MultipartFile参数。

voidsetFieldDefaultPrefix(java.lang.String fieldDefaultPrefix)

指定可用于指示默认值字段的参数的前缀,其名称为“prefix + field”。

voidsetFieldMarkerPrefix(java.lang.String fieldMarkerPrefix)

指定一个前缀,该前缀可用于标记可能为空的字段的参数,并将“prefix + field”作为名称

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值