当前位置: 首页 > news >正文

如何实现一个Java的@注解?

先看一段代码:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public ResponseEntity defaultErrorHandler(Exception e) {// 将错误信息转成字符串String errorMessage = ExceptionUtils.getStackTrace(e);// 创建响应实体,包含错误消息和状态码return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR);}
}

上述代码中,GlobalExceptionHandler类用@ControllerAdvice注解标识,表示其定义的配置和方法能够全局应用。

然后在该类中定义了一个defaultErrorHandler方法,并用@ExceptionHandler注解标识。这个方法定义了对任意Exception类型异常的处理。当任意一个Controller中抛出Exception类型的异常时,这个方法就会被调用。方法内部首先将异常详细堆栈信息转成字符串,然后以此为响应体,返回一个500状态码的ResponseEntity对象。

所以嘛再上代码:

先定义一个注解(BankResponseBody):

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BankResponseBody {
}

通过@ControllerAdvice注解实现和这个注解:

// ControllerAdvice将会被应用到所有带有@BankResponseBody注解的控制器!!!
@ControllerAdvice(annotations = {BankResponseBody.class}) 
@Slf4j 
// 声明了公共的 BankResponseBodyAdvice类,并实现了 ResponseBodyAdvice接口
public class BankResponseBodyAdvice implements ResponseBodyAdvice { @Override // 这个方法决定当前HandlerMethod的执行返回的对象是否支持拦截public boolean supports(MethodParameter returnType, Class converterType) { return true; // 设定为返回true,表示支持所有类型}@Override// 这个方法在将返回值写入到Response前执行public Object beforeBodyWrite( Object body,                     // 准备写入Response的对象MethodParameter returnType,      // HandlerMethod的返回类型MediaType selectedContentType,   // 响应的内容类型Class selectedConverterType,     // 选择的转换器类型ServerHttpRequest request,       // 当前的请求对象ServerHttpResponse response)     // 当前的响应对象{log.info("处理XX回调接口的返回值{}",body); // 使用log对象记录一条信息,{}这是占位符,表示日志中的动态内容,这里会被body替换。return body;                               // 返回经处理后的对象,这里直接返回了原封不动的body}
}

实现了吧 (^_^)∠※

然后在Spring框架中,除了ResponseBodyAdvice,还存在许多其他接口吗?

有的常见的包括:

  1. RequestBodyAdvice接口:这个接口和ResponseBodyAdvice相似,不过它是用来处理请求数据的,即在请求数据绑定到方法参数上之前对请求数据进行预处理。

  2. HandlerInterceptor接口:这个接口用于拦截处理Controller的请求,它有三个方法:preHandle(在Controller方法执行前调用),postHandle(在Controller方法执行后,渲染视图前调用),afterCompletion(渲染视图后调用)。

  3. WebMvcConfigurer接口:这个接口通常用于扩展Spring MVC的功能,比如添加视图控制器、静态资源处理、拦截器等。

  4. ViewResolver接口:这个接口用于将逻辑视图名解析为具体的视图对象。

以上只是一部分接口,Spring中有大量的接口可供开发者使用,来满足不同的开发需求。一般来说,每个接口都有其特定的应用场景和作用,具体要选择使用哪个接口,取决于你希望实现的功能。

还有其他实用注解吗?

有的,@ControllerAdvice是Spring框架中一个非常实用的注解。它是一个@Component类,所以Spring容器会自动检测到它。@ControllerAdvice注解允许我们将一些全局的配置(例如异常处理、数据绑定等)提取出来放在一个地方,让所有的控制器都能享用,简化了代码的复用。

使用@ControllerAdvice可以做到以下的一些事情,让我们的程序更优雅:

  1. 全局异常处理:我们可以使用@ControllerAdvice和@ExceptionHandler注解捕获全局异常。

  2. 全局数据绑定:我们可以使用@ControllerAdvice和@ModelAttribute注解将常用的数据放在一个地方,每个Controller都能访问到。

  3. 全局数据预处理:我们可以使用@ControllerAdvice和@InitBinder注解,对请求参数进行预处理。

所以说,如果你正在使用Spring框架,那么这个注解肯定会是你的最佳助手之一!

http://www.lryc.cn/news/331240.html

相关文章:

  • 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记12:DAC数模转换
  • 迅饶科技 X2Modbus 网关 GetUser 信息泄露漏洞复现
  • 修改亚马逊云科技账户的密码和MFA
  • 提升性能与精准追踪:SkyWalking自定义跟踪忽略插件
  • 第十三届蓝桥杯大赛软件赛省赛CC++大学B组
  • zookeeper监听集群节点的实现zkclient组件实现方案(Java版)
  • 【ArduinoQuartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能
  • 【电路笔记】-逻辑与门
  • 蓝桥杯练习——拼出一个未来
  • stm32f103c8t6学习笔记(学习B站up江科大自化协)-SPI
  • 云计算的安全需求
  • 【C++】编程规范之表达式原则
  • Python人工智能基础知识:理解神经网络与机器学习的基本概念
  • 10_MVC
  • 【Java多线程(4)】案例:设计模式
  • 时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测
  • java面试题(4)|Spring和Spring Boot之间有什么关联和区别
  • Spring Boot中前端通过请求接口下载后端存放的Excel模板
  • 构建企业级微服务平台:实现可扩展性、弹性和高效性
  • 存内计算技术在边缘计算、物联网设备中的应用及前景
  • C#使用Selenium驱动Chrome浏览器
  • 【软件工程】详细设计(二)
  • 数据质量决定大模型能力,景联文科技提供高质量大模型数据
  • 大话设计模式之状态模式
  • 【机器学习】“强化机器学习模型:Bagging与Boosting详解“
  • 《QT实用小工具·九》设备按钮控件
  • 计算机服务器中了helper勒索病毒怎么办,helper勒索病毒解密流程步骤
  • qT 地图显示飞机轨迹
  • 智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案
  • Linux实用性脚本 [bash]