ControllerAdvice用法

ControllerAdvice用法

@ControllerAdvice是一个组件注解,它允许你在一个地方处理整个应用程序控制器的异常、绑定数据和预处理请求。这意味着你不需要在每个控制器中重复相同的异常处理代码,从而使得代码更加简洁、易于管理。

主要特性

  • 全局异常处理:通过@ExceptionHandler注解捕获全局异常,减少重复的错误处理代码。
  • 数据绑定:使用@InitBinder注解自定义请求参数的格式化和转换。
  • 全局数据预处理:通过@ModelAttribute注解添加全局模型属性,这些属性对所有的@RequestMapping方法都是可见的。

全局异常处理

在开发过程中,统一异常处理是非常重要的一环。使用@ControllerAdvice,你可以定义一个或多个方法来处理整个应用中的异常。这样,当应用抛出异常时,Spring会自动寻找带有@ExceptionHandler的方法来处理它。

返回 ResponseEntity

使用@ControllerAdvice进行全局异常处理的示例代码:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception ex) {// 可以记录日志return new ResponseEntity<>("发生异常: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

在这个例子中,我们定义了一个GlobalExceptionHandler类,并使用@ControllerAdvice注解标记。其中,@ExceptionHandler(Exception.class)注解表示这个方法可以处理所有类型的异常。当应用中发生异常时,这个方法会被调用,并返回一个包含错误信息的ResponseEntity对象。

直接使用HttpServletResponse返回json

@ControllerAdvice使用中,除了返回ResponseEntity对象外,还可以通过HttpServletResponse直接写入响应来返回JSON格式的错误信息。这种方式在需要更灵活控制响应内容和格式时非常有用,特别是在构建RESTful API时。

以下是一个示例,展示了如何在拦截到异常后通过HttpServletResponse返回JSON格式的错误信息:

@ControllerAdvice
public class GlobalExceptionHandlerWithResponse {@ExceptionHandler(Exception.class)public void handleException(Exception ex, HttpServletResponse response) throws IOException {response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());response.setContentType("application/json");// 使用Jackson或其他JSON处理库将错误信息转换为JSON格式String jsonResponse = "{\"error\": \"" + ex.getMessage() + "\"}";response.getWriter().write(jsonResponse);}
}

在这个例子中,handleException方法除了接收异常对象Exception作为参数外,还接收了HttpServletResponse对象。这允许我们直接向响应输出流写入内容。首先,我们通过setStatus方法设置了HTTP状态码,然后通过setContentType方法指定了响应的内容类型为application/json。最后,我们构造了一个包含错误信息的JSON字符串,并通过response.getWriter().write(jsonResponse)将其写入响应体中。

返回自定义通用返回类

handleException方法可以直接返回一个自定义的通用返回对象,Spring框架会自动将该对象序列化为JSON格式返回给客户端。这是通过Spring MVC的消息转换器(如MappingJackson2HttpMessageConverter)自动完成的,前提是你已经在项目中加入了JSON处理库(如Jackson)。

以下是一个示例,展示如何返回一个自定义的通用返回对象,并让Spring自动将其序列化为JSON格式:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)@ResponseBody // 确保返回的对象被序列化为JSONpublic ErrorResponse handleException(Exception ex) {return new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());}// 自定义的通用返回对象类public static class ErrorResponse {private int status;private String message;public ErrorResponse(int status, String message) {this.status = status;this.message = message;}// getter和setter省略}
}

在这个例子中,handleException方法返回了一个ErrorResponse对象,该对象包含了错误状态码和错误消息。我们通过@ResponseBody注解告知Spring,这个方法的返回值应该被视为响应体,并且需要被转换为JSON格式。

Spring MVC在内部使用配置的HTTP消息转换器来将返回对象序列化为JSON。如果你的项目依赖于Jackson库,Spring会使用MappingJackson2HttpMessageConverter自动将ErrorResponse对象转换为JSON格式,然后发送给客户端。

这种方式简化了异常处理的代码,同时也提供了返回结构化错误信息的灵活性,非常适合构建RESTful API和微服务架构。

自定义参数绑定

当你需要对进入控制器的请求参数进行自定义处理时,比如日期格式的转换,@ControllerAdvice配合@InitBinder可以全局定义转换规则,避免在每个控制器中重复定义。

使用@InitBinder自定义日期格式绑定的示例:

@ControllerAdvice
public class GlobalBindingInitializer {@InitBinderpublic void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));}
}

在这个例子中,我们通过@InitBinder注解标记的方法initBinder中,注册了一个自定义的编辑器CustomDateEditor,用于将字符串转换为Date类型。这意味着,当Spring MVC接收到日期格式的字符串参数时,会自动使用这个编辑器进行转换。

添加全局数据模型

有时候,你可能希望某些数据对所有的控制器都是可用的,比如用户登录信息、全局配置信息等。@ControllerAdvice允许你通过@ModelAttribute注解轻松实现这一点。

使用@ModelAttribute添加全局数据模型的例子:

@ControllerAdvice
public class GlobalModelAttributes {@ModelAttribute("globalMessage")public String globalMessage() {return "这是一个全局消息";}
}

在这个例子中,我们使用@ModelAttribute注解定义了一个方法globalMessage,该方法返回一个字符串。这个字符串会被添加到所有控制器方法的模型中,可以在视图中使用${globalMessage}来访问它。

参考链接

  • Spring官方文档:链接地址
  • @ControllerAdvice详细用法:链接地址

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/813019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue】v-model.lazy等(非实时渲染)

v-model&#xff1a;实时渲染v-model.lazy&#xff1a;失去焦点/按回车后&#xff0c;才渲染v-model.number&#xff1a;值转换为数字v-model.trim&#xff1a;去除首尾空格 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

MDK平台 - Code, RO-data , RW-data, ZI-data详解

文章目录 1 . 前言2 . Code, RO-data , RW-data, ZI-data解析3 . RAM上电复位4 . 细节扩展5 . 总结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 MDK编译后&#xff0c;会列出Code, RO-data , RW-data, ZI-data&#xff0c;以下解析…

股票价格预测 | Python使用LSTM预测股票价格

文章目录 效果一览文章概述代码设计效果一览 文章概述 Python使用LSTM预测股票价格 代码设计 import pandas as pd import matplotlib.pyplot as plt import numpy as np import tensorflowfrom numpy import

我可以信任XEX吗?

在数字货币领域&#xff0c;安全一直是我们最为关注的话题之一。作为一个积极参与加密货币交易的投资者&#xff0c;我深知选择一个安全可靠的交易所至关重要。在众多交易所中&#xff0c;我发现XEX是最安全的交易所之一。 每当我想要进行加密货币交易时&#xff0c;第一件事就…

git合并冲突

git合并冲突 问题描述 Auto-merging mes5server/mes5j.json Auto-merging mes5server/mes5j.json CONFLICT (content): Merge conflict in mes5server/mes5j.json Automatic merge failed; fix conflicts and then commit the result.原因 要合并的两个分支改动了同一份文件…

深入理解MySQL中的log_bin_trust_function_creators系统变量

在MySQL数据库管理中&#xff0c;尤其是在涉及到数据复制与恢复的情境下&#xff0c;二进制日志&#xff08;Binary Log&#xff09;扮演着至关重要的角色。它忠实记录了对数据库内容进行修改的SQL语句&#xff0c;为数据同步、故障恢复等任务提供了关键信息。然而&#xff0c;…

K8S资源管理之LimitRange

资源配置范围管理&#xff1a;LimitRange 在默认情况下&#xff0c;Kubernetes不会对Pod加CPU和内存的限制&#xff0c;这意味着Kubernetes系统中的任何Pod都可以使用其节点的所有可用的CPU和内存。 如果一个机器的Pod特别多&#xff0c;我们又不愿意为每个Pod都配置上…

2024年蓝牙耳机哪个品牌最好?五大热门机型PK,新手必看!

​随着生活节奏的加快&#xff0c;蓝牙耳机已经成为了我们日常生活中不可或缺的伙伴。它不仅让我们的听音乐、观看视频和通话变得更加便捷&#xff0c;还带来了无线的自由体验。面对市场上众多的选择&#xff0c;我为你精挑细选了几款表现优异的蓝牙耳机&#xff0c;希望能帮助…

mybiats-puls-插入测试以及雪花算法

一&#xff0c;测试 /* * 插入测试 * */ Test public void test01() {User user new User();/** 自动帮我们生成id* */user.setName("kuku");user.setAge(3);user.setEmail("2983394967qq.com");final int insert mapper.insert(user);System.out.print…

Redis从入门到精通(十六)多级缓存(一)Caffeine、JVM进程缓存

文章目录 第6章 多级缓存6.1 什么是多级缓存&#xff1f;6.2 搭建测试项目6.2.1 项目介绍6.2.2 新增商品表6.2.3 编写商品相关代码6.2.4 启动服务并测试6.2.5 导入商品查询页面&#xff0c;配置反向代理 6.3 JVM进程缓存6.3.1 Caffeine6.3.2 实现JVM进程缓存6.3.2.1 需求分析6.…

基于springboot仿雀语的文档管理系统

项目介绍 本项目借鉴了雀语的一些UI设计&#xff0c;实现了文档在线管理的功能&#xff0c;知识库可以对不同分类的文档建立不同的库&#xff0c;知识库里面左边可以维护菜单菜单目录&#xff0c;右边实现在线预览。该项目可以防止用户下载和复制文档&#xff0c;只支持在线预…

TSINGSEE青犀AI智能分析网关V4吸烟/抽烟检测算法介绍及应用

抽烟检测AI算法是一种基于计算机视觉和深度学习技术的先进工具&#xff0c;旨在准确识别并监测个体是否抽烟。该算法通过训练大量图像数据&#xff0c;使模型能够识别出抽烟行为的关键特征&#xff0c;如烟雾、手部动作和口部形态等。 在原理上&#xff0c;抽烟检测AI算法主要…

Dockerfile中 CMD和ENTRYPOINT的区别

在 Dockerfile 中&#xff0c;CMD 和 ENTRYPOINT 都用于指定容器启动时要执行的命令。它们之间的主要区别是&#xff1a; - CMD 用于定义容器启动时要执行的命令和参数&#xff0c;它设置的值可以被 Dockerfile 中的后续指令覆盖&#xff0c;包括在运行容器时传递的参数。如果…

Angular 13新特性概览与升级指南

Angular 13是Angular框架的最新版本&#xff0c;它引入了一些新的特性和改进。下面是Angular 13的一些新特性概览和升级指南&#xff1a; Ivy Renderer改进&#xff1a;Angular 13进一步改进了Ivy渲染器&#xff0c;提供更好的性能和更小的包大小。这意味着你可以在应用程序中获…

如何测试PostgreSQL数据库的性能

在这篇博客里&#xff0c;我将展示如何测量 PostgreSQL 数据库服务器的性能&#xff0c;并指导你如何运行一个基准测试。 基准测试旨在评估和比较不同配置、拓扑结构、系统和组件的性能。为此&#xff0c;我将使用 pgbench 工具。 你可能会问&#xff0c;为什么要使用一个单独…

Java 语言程序设计(基础篇)原书第10版 梁勇著 PDF 文字版电子书

简介 Java 语言程序设计&#xff08;基础篇&#xff09;原书第 10 版 是 Java 语言的经典教材&#xff0c;中文版分为基础篇和进阶篇&#xff0c;主要介绍程序设计基础、面向对象程序设计、GUI 程序设计、数据结构和算法、高级 Java 程序设计等内容。本书通过示例讲解问题求解…

蓝桥杯嵌入式(G431)备赛——最后一晚查漏补缺

蓝桥杯嵌入式&#xff08;G431&#xff09;备赛笔记——初始化cubeMX 蓝桥杯嵌入式&#xff08;G431&#xff09;备赛笔记——LED 蓝桥杯嵌入式&#xff08;G431&#xff09;备赛笔记——按键模块设计 蓝桥杯嵌入式&#xff08;G431&#xff09;备赛笔记——LCD按键 蓝桥杯…

杂货铺 | Linux虚拟机Ubuntu操作系统下设置共享文件夹(以及找不到hgfs文件夹怎么办)

文章目录 &#x1f4da;步骤一&#xff1a;配置共享文件夹&#x1f4da;步骤二&#xff1a;配置挂载环境&#x1f4da;步骤三&#xff1a;解决权限问题&#x1f4da;步骤四&#xff1a;解决重启失效问题 &#x1f4da;步骤一&#xff1a;配置共享文件夹 建立本地共享文件夹&…

07.QT信号和槽-2

一、自定义信号和槽 在Qt中&#xff0c;允许⾃定义信号的发送⽅以及接收⽅&#xff0c;即可以⾃定义信号函数和槽函数。但是对于⾃定义的信号函数和槽函数有⼀定的书写规范。 1.基本语法 1.1 自定义信号 &#xff08;1&#xff09;⾃定义信号函数必须写到"signals"…

2024 DTC大会精彩演讲:DBdoctor,基于eBPF重新定义数据库可观测 (附PPT下载和演讲视频)

由中国DBA联盟&#xff08;ACDU&#xff09;和墨天轮社区联合主办的第十三届数据技术嘉年华&#xff08;DTC&#xff09;于北京盛大召开。4月13日上午海信聚好看云平台负责人张纪宽受邀在『数据库生态软件』分论坛发表主题演讲《DBdoctor&#xff1a;利用eBPF技术实现数据库智能…