您现在的位置是:首页 > 编程 > 

【Spring Boot】027

2025-07-24 08:23:26
【Spring Boot】027 【Spring Boot】027-@ControllerAdvice 与 @RestControllerAdvice一、@ControllerAdvice概述1、简介@ControllerAdvice 是 @Controller 的增强版,其主要用来处理全局数据,一般搭配 @ExceptionHandler 、@ModelAttribute 以及 @InitBin

【Spring Boot】027

【Spring Boot】027-@ControllerAdvice 与 @RestControllerAdvice一、@ControllerAdvice概述

1、简介

@ControllerAdvice 是 @Controller 的增强版,其主要用来处理全局数据,一般搭配 @ExceptionHandler 、@ModelAttribute 以及 @InitBinder 使用!

2、使用场景

  • 全局异常处理;
  • 添加全局数据;
  • 请求参数预处理;
二、全局异常处理

1、概述

@ControllerAdvice 最常见的使用场景就是全局异常处理。在文件上传时,有时候文件超过最大限制,就会抛出异常,此时我们可以通过 @Controller 结合 @ExceptionHandler 定义全局异常捕捉机制!

2、代码演示

Thymeleaf几乎不用了,不再演示!

自定义异常处理类 CustomExceptionHandler
代码语言:javascript代码运行次数:0运行复制
package com.zibo.apimon.handler;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.MaxUploadSizeExceededException;

import javax.servlet.http.HttpServletRespe;
import java.io.IOException;
import java.io.PrintWriter;

@ControllerAdvice
public class CustomExceptionHandler {
    
    @ExceptionHandler()
    public void uploadException(MaxUploadSizeExceededException e, HttpServletRespe resp) throws IOException{
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.write("上传文件大小超出限制!");
        out.flush();
        ();
    }
    
}
resources/static目录下的upload.html
代码语言:javascript代码运行次数:0运行复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="uploadFile" value="请选择文件">
    <input type="submit" value="上传">
</form>

</body>
</html>
文件上传处理接口FileUploadController
代码语言:javascript代码运行次数:0运行复制
package com.zibo.file;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@RestController
public class FileUploadController {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
    @PostMapping("upload")
    public String upload(MultipartFile uploadFile, HttpServletRequest request){
        String realPath = request.getSession().getServletContext().getRealPath("/uploadFile/");
        String format = sdf.format(new Date());
        File folder = new File(realPath + format);
        if(!folder.isDirectory()){
            ();
        }
        String oldame = uploadFile.getOriginalFilename();
        String newame = UUID.randomUUID().toString() + oldame.substring(oldame.lastIndexOf("."));
        try {
            (new File(folder,newame));
            return request.getScheme() + "://" + request.getServerame() + ":" + request.getServerPort() + "/uploadFile/" + format + "/" + newame;
        }catch (IOException e){
            e.printStackTrace();
        }
        return "上传失败!";
    }
}

、运行测试

上传正常大小的图片
image-2021081709285511
上传较大的图片
image-20210817092952514
三、添加全局数据

1、概述

@ControllerAdvice 是一个全局数据处理组件,因此也可以在其中配置全局数据,使用 @ModelAttribute 注解进行配置。

2、代码演示

全局数据配置 GlobalConfig
代码语言:javascript代码运行次数:0运行复制
package com.zibo.;

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 {
    // info表示的是返回数据的key
    @ModelAttribute(value = "info")
    public Map<String,String> userInfo(){
        Map<String,String> map = new HashMap<>();
        map.put("username","刘备");
        map.put("gender","男");
        return map;
    }
}
在Controller中使用全局数据

注意 @RestController 和 @Controller 两个注解的区别!@RestController = @Controller + @RespeBody 这里就暂时使用 @Controller 吧!因为很少用,所以用一下吧,增强记忆!

代码语言:javascript代码运行次数:0运行复制
package com.zibo.;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@Controller
public class HelloController {

    @RequestMapping("hello")
    @RespeBody
    public Object hello(Model model){
        Map<String, Object> map = model.asMap();
        return map.get("info");
    }

}

、运行结果

image-2021081709476527
四、请求参数预处理

1、概述

@ControllerAdvice 结合 @InitBinder 实现对请求参数预处理!

2、代码示例

仅作写法展示,未进行实际测试!

实体类:Book
代码语言:javascript代码运行次数:0运行复制
package com.zibo.;

import lombok.Data;

@Data
public class Book {
    private String name;
    private String author;
}
实体类:Author
代码语言:javascript代码运行次数:0运行复制
package com.zibo.;

import lombok.Data;

@Data
public class Author {
    private String name;
    private Integer age;
}
Controller 接收实体类(错误写法)

这么写的问题:book 和 author 中都有 name 属性,会导致数据混淆错误!

代码语言:javascript代码运行次数:0运行复制
    @RequestMapping("hi")
    public String hi(Book book, Author author){
        return () + "==>" + ();
    }
Controller 接收实体类(正确写法)
代码语言:javascript代码运行次数:0运行复制
    @RequestMapping("hi")
    public String hi(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author){
        return () + "==>" + ();
    }
GlobalConfig
代码语言:javascript代码运行次数:0运行复制
package com.zibo.;

import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;

import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class GlobalConfig {

    @InitBinder("b")
    public void init(WebDataBinder binder){
        binder.setFieldDefaultPrefix("b.");
    }

    @InitBinder("a")
    public void init2(WebDataBinder binder){
        binder.setFieldDefaultPrefix("a.");
    }
}
五、@RestControllerAdvice

1、与 @ControllerAdvice 区别

代码演示省略!

简单地说,@RestControllerAdvice 与 @ControllerAdvice 的区别就和 @RestController 与 @Controller 的区别类似,@RestControllerAdvice 注解包含了 @ControllerAdvice 注解和 @RespeBody 注解。

当自定义类加@ControllerAdvice注解时,方法需要返回json数据时,每个方法还需要添加@RespeBody注解;

当自定义类加@RestControllerAdvice注解时,方法自动返回json数据,每个方法无需再添加@RespeBody注解;

2、@RestController 与 @Controller 的区别

@RestController = @Controller + @RespeBody

使用@Controller 注解

在对应的方法上,视图解析器可以解析 return 的 jsp,html 页面,并且跳转到相应页面

若返回 json 等内容到页面,则需要加 @RespeBody 注解;

@RestController注解

相当于 @Controller + @RespeBody 两个注解的结合,返回 json 数据不需要在方法前面加 @RespeBody 注解了,但使用@RestController 这个注解,就不能返回 jsp,html 页面,视图解析器无法解析 jsp,html 页面;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent 删除数据异常处理注解springboot

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1198697.html

相关标签:无
上传时间: 2025-07-23 12:33:03

上一篇:【Spring Boot】028

下一篇:【Spring Boot】026

留言与评论(共有 7 条评论)
本站网友 深圳平安保险
0秒前 发表
@RestControllerAdvice1
本站网友 老年斑的治疗方法
14分钟前 发表
代码演示 Thymeleaf几乎不用了
本站网友 汇众益智
29分钟前 发表
不再演示! 自定义异常处理类 CustomExceptionHandler代码语言:javascript代码运行次数:0运行复制package com.zibo.apimon.handler; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.MaxUploadSizeExceededException; import javax.servlet.http.HttpServletRespe; import java.io.IOException; import java.io.PrintWriter; @ControllerAdvice public class CustomExceptionHandler { @ExceptionHandler() public void uploadException(MaxUploadSizeExceededException e
本站网友 北京影城
2分钟前 发表
原始发表:2025-01-06
本站网友 糖尿病人饮食食谱
15分钟前 发表
使用场景全局异常处理;添加全局数据;请求参数预处理;二
本站网友 乔布斯壁纸
4分钟前 发表
Object> map = model.asMap(); return map.get("info"); } }