大数跨境
0
0

注意!@ExceptionHandler异常处理注解有新功能了

注意!@ExceptionHandler异常处理注解有新功能了 Spring全家桶实战案例
2025-02-05
0
导读:@ExceptionHandler异常注解新功能

Spring Boot 3实战案例合集》现已囊括超过90篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

Spring Boot 3实战案例锦集》PDF电子书现已出炉!

🎉🎉我们精心打造的《Spring Boot 3实战案例锦集》PDF电子书现已正式完成,目前已经有90个案例,后续还将继续更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。随着Spring相关技术的更新升级,我们的电子书也将持续更新,确保您始终掌握最前沿、最实用的技术知识。

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

现在就订阅合集




环境:SpringBoot3.4.0



1. 简介

@ExceptionHandler 是 Spring MVC 中用于处理异常的注解。它允许开发者在控制器类中定义特定的方法来处理一个或多个类型的异常,从而提供了一种集中式的方式来管理异常处理逻辑。使用这个注解,你可以指定哪个方法应该处理哪种异常,使得错误处理更加清晰和模块化。如下简单示例:

@RestControllerAdvicepublic class GlobalControllerAdvice {    @ExceptionHandler(BusinessException.class)  public ResponseEntity<Object> handleException(Exception e) {    // ...  }  @ExceptionHandler(CommonException.class)  public ResponseEntity<Object> handleException(Exception e) {    // ...  }  // ...}

当API接口调用中发送了上面指定的异常后都会被上面对应的的方法处理。

从Spring 6.2开始新增了一新功能,我们在该注解中不但可以指定异常的类型,而且还可以指定生成的媒体类型。

2. 实战案例

@ExceptionHandler注解允许根据HTTP客户端请求的媒体类型(通常在"Accept" HTTP请求头中指定)来定制错误响应。对于相同的异常类型,应用程序可以直接在注解上声明可生成的媒体类型:

@ControllerAdvicepublic class GlobalControllerAdvice {    @ExceptionHandler(produces = "application/json")  public ResponseEntity<Object> handleJson(Exception e) {    return ResponseEntity.badRequest().body(Map.of("code", -1, "message", e.getMessage())) ;  }
@ExceptionHandler(produces = "text/html")  public String handleHtml(Exception e) { return "customError"; }}

当请求时Accept头部指定为application/json,则在请求发生错误时将由handleJson方法进行处理;如果Accept头部指定为text/html,则由handleHtml方法进行处理。

handleJson方法会直接输出通过ResponseEntity设置的内容;然而,handleHtml方法返回的是一个名为customError的模型数据(或视图名),此时Spring MVC底层会利用视图解析器ViewResolver来解析这个数据,从而获取到对应的View对象(这可能是一个HTML页面、Thymeleaf模板或其他类型的视图,具体取决于配置),进而渲染出HTML格式的错误页面。

所以,这里我们还要配置对应的视图对象bean,如下:

@Configurationpublic class ViewConfig {
@Bean(name = "customError") View customError() { return new View() { @Override public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/html;charset=utf-8") ;        response.getWriter().append("<h1>请求错误</h1>"); } @Override public String getContentType() { return "text/html"; } }; }}

测试接口

@GetMapping("")public Object index() {  System.err.println(1/0) ;  return "error" ;}

通过postman进行测试

异常处理逻辑根据请求header Accept响应不同的数据格式。

我们在这里遇到了一个问题:在返回text/html格式的错误页面时,如何展示当前发生的具体异常信息呢?

代码修改如下:

@ExceptionHandler(produces = "text/html")public String handleHtml(Exception e, Model model) {  model.addAttribute("message", e.getMessage()) ;  return "customError";}

异常处理方法添加了Model类型参数,接着设置了message属性,其值为当前的异常信息。

public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {  response.setContentType("text/html;charset=utf-8") ;  response.getWriter().append(model.get("message").toString());}

在View#reader方法中我们可以直接从Map中获取之前设置的错误消息。

如上修改后,再次通过浏览器访问

浏览器默认请求的Accept类型为text/html。

注意:Spring 6.2开始@ExceptionHandler注解还添加了一个属性exception,如下:

public @interface ExceptionHandler {
@AliasFor("exception") Class<? extends Throwable>[] value() default {};  // 6.2 @AliasFor("value") Class<? extends Throwable>[] exception() default {}; // 6.2  String[] produces() default {};}

还是用来指定具体异常类的。


以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

Spring Boot 记录Controller接口请求日志7种方式,第六种性能极高

太强了!动态脚本引擎QLExpress,实现各种复杂的业务规则

高级开发!Spring Boot 自定义@Transactional,底层原理很简单

优雅!Spring状态机!状态自动化管理太方便了

任务重复执行?SpringBoot 一个注解轻松搞定分布式任务调度

当心!SpringBoot在以下几种情况将导致代理失效

SpringBoot3优雅停止/重启定时任务

写给新手!Spring AOP代理机制,必须清楚,否则各种失效

详解Spring Cloud Task短期运行的微服务框架

【Spring/Boot/Cloud】这些扩展点一定要知道,从应用到原理详解

一文彻底玩转@RequestMapping,高级用法你未必知道

几个强大的Spring Boot扩展点

有多少人用过Spring的@Lookup注解?

是否还记得SpringMVC中的@MatrixVariable注解?

d

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读285
粉丝0
内容832