抛出异常时仍然需要记录错误日志

场景:当service的方法执行抛出异常时,事务会发生回滚,导致无法记录错误日志

解决:切面

其他:1.日志需要记录日志标题,保存入参

           2.失败时会抛出异常;日志需要判断执行是否成功,记录状态

           3.只是模拟操作,实际情况需要将日志保存到数据库

引入依赖:

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

代码:

1. 日志记录时需要加标题,每个方法的日志标题不一样,解决办法是切面+自定义注解

package com.test.Annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {String logTitle() default "";//日志标题
}

 controller的方法上加注解:

 @LogAnnotation(logTitle = "post测试")@PostMapping("/login")public String login(@RequestBody Department department) throws Exception{return "hello World";}

2. 配置切面

package com.test.aspect;import com.test.Annotation.LogAnnotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Arrays;@Aspect
@Component
public class LogAspect {@Autowiredprivate HttpServletRequest request;//    @Pointcut("@annotation(com.test.aspect.LogAnnotation)") //单独设置@Pointcut("execution(* com.test.controller.*.*(..)) && @annotation(com.test.Annotation.LogAnnotation)") //同时设置public void pt() {}@Around("pt()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {Object result = null;try{MethodSignature signature = (MethodSignature)joinPoint.getSignature();Method method = signature.getMethod();LogAnnotation logAnnotation =method.getAnnotation(LogAnnotation.class);System.out.println("@anno logtitle = " + logAnnotation.logTitle());//自定义注解-日志名称System.out.println("method = " + method.getName());//方法名System.out.println("params = " + Arrays.toString(joinPoint.getArgs()));//参数,post和get都可以获取;也可以转为JSON格式result = joinPoint.proceed();//执行结果,即response返回的数据System.out.println("response = " + result);//todo:记录状态为true的日志,dao操作省略return result;}catch (Exception e) {//如果controller的方法执行时发生异常,会被捕获异常,可以在这里记录错误日志System.out.println("method has exception, e = " + e);//todo:记录状态为false的日志,dao操作省略}return result;}
}

3.测试

3.1 get测试: 发送请求:http://localhost:8081/hello?userId=abc

a. get测试-正常请求时

@LogAnnotation(logTitle = "get测试")@GetMapping("/hello")public String hello(@RequestParam(value="userId", required = false) String userId) throws Exception{return "hello World";}

打印:

@anno logtitle = get测试
method = hello
params = [abc]
response = hello World

b. get测试-抛出异常时

@LogAnnotation(logTitle = "get测试")@GetMapping("/hello")public String hello(@RequestParam(value="userId", required = false) String userId) throws Exception{try {int i = 1/0;}catch (Exception e) {throw new Exception("eeeeeee");}return "hello World";}

打印:

@anno logtitle = get测试
method = hello
params = [abc]
method has exception, e = java.lang.Exception: eeeeeee

3.2 post请求

@LogAnnotation(logTitle = "post测试")@PostMapping("/login")public String login(@RequestBody Department department) throws Exception{return "登录成功";}

post请求,路径:localhost:8081/login

body:

{"id":1,"departName":"部门名称"
}

打印

@anno logtitle = post测试
method = login
params = [Department(id=1, departName=部门名称)]
response = 登录成功

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

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

相关文章

2024年汉字小达人活动4个多月开赛:18道历年选择题和答案、解析

根据近年的安排&#xff0c;2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷…

联想端游联运SDK接入指南

1. 接入流程 本文档主要介绍了 联想PC游戏SDK接入流程、联想游戏提供的功能、接入注意事项等。 1.1. 接入方式 1. 联想游戏SDK2.1版本支持“账号防沉迷支付”接入方式&#xff1b; a. 联想提供账号注册、登录等能力 b. 联想提供防沉迷服务 c. 联想提供游戏内支付 1.2. 对…

【学习笔记】计算机组成原理(八)

CPU 的结构和功能 文章目录 CPU 的结构和功能8.1 CPU的结构8.1.1 CPU的功能8.1.2 CPU结构框图8.1.3 CPU的寄存器8.1.4 控制单元CU和中断系统 8.2 指令周期8.2.1 指令周期的基本概念8.2.2 指令周期的数据流 8.3 指令流水8.3.1 指令流水原理8.3.2 影响流水线性能的因素8.3.3 流水…

meinheld-gunicorn-flask VS uvicorn-gunicorn-fastapi 性能对比测试

本文会使用如下两个项目&#xff1a;meinheld-gunicorn-flask 与 uvicorn-gunicorn-fastapi 前文有测过 Flask vs FastApi 性能对比测试&#xff0c;可能不够有说服力&#xff0c;这次使用了号称最快的wsgi或asgi服务器gunicorn来运行flask或fastapi。 上面meinheld-gunicorn…

数据库-SQL性能分析

SQL执行频率 慢查询日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;秒&#xff0c;默认10秒&#xff09;的所有 SQL语句的日志。 MySQL的慢查询日志默认没有开启&#xff0c;我们可以查看一下系统变量 slow_query_l…

html5 笔记02

目录 01 svg的基本使用 02 svg绘图 03 进程和线程 01 svg的基本使用 svg和canvas的区别: canvas: 1.canvas作为一个容器只有一个dom元素 ,内部元素无法使用dom操作 (canvas不能展开然后选择不到 svg查看元素能选中因为是通过标签控制的) 2.canvas 是配合js完成各种绘制效果 …

vue-route的路由配置中父组件没有component怎么处理

概述 为了方便开发和维护&#xff0c;所以web前端的路由配置路径和前端代码文件路径一般是一致的。但在实际开发中&#xff0c;项目可能会分很多级的菜单&#xff0c;由于很多菜单只有叶子菜单是真正的页面。而中间菜单项只是一个路由配置。 为了正确路由到底层的功能页面&…

指纹识别概念解析

目录 1. 指纹是物证之首 1.1 起源于中国 1.2 发展于欧洲 1.3 流行于全世界 2. 指纹图像 3. 指纹特征 4. 指纹注册 5. 指纹验证 6. 指纹辨识 1. 指纹是物证之首 指纹识别技术起源于中国、发展于欧洲、流行于全世界。自20世纪以来&#xff0c;指纹在侦破刑事案件、解决诉…

水泥超低排平台哪家好?

随着环保政策的加强和绿色发展理念的深入人心&#xff0c;水泥行业的超低排放改造已成为行业发展的新趋势。选择一个合适的水泥超低排平台对于确保改造效果和实现企业的可持续发展至关重要。朗观视觉小编将从多个角度出发&#xff0c;为您提供一份综合评估与选择攻略&#xff0…

Spring Boot 3.x 与 Spring Boot 2.x 的对比

Spring Boot 是 Java 开发领域的一个重要框架&#xff0c;它简化了基于 Spring 的应用开发。随着版本的不断更新&#xff0c;Spring Boot 提供了更多功能、更好的性能以及更简洁的配置。本文将详细对比 Spring Boot 3.x 和 Spring Boot 2.x&#xff0c;探讨它们之间的主要区别和…

[C语言]自定义类型详解:结构体、联合体、枚举

目录 &#x1f680;结构体 &#x1f525;结构体类型的声明 &#x1f525;结构的自引用 &#x1f525;结构体变量的定义和初始化 &#x1f525;结构体内存对齐 &#x1f525;结构体传参 &#x1f525;结构体实现位段&#xff08;位段的填充&可移植性&#xff09; &a…

安装 Ubuntu桌面版,详细步骤(附引导 U盘制作工具)

下载镜像 安装Ubuntu首先要下载镜像包&#xff0c;访问下面网址下载镜像包 https://releases.ubuntu.com/ 选择你要安装的Ubuntu版本 将 .iso 文件保存到所需位置&#xff0c;下面会使用此文件创建可引导 U盘。 制作 Ubuntu 引导 U 盘 首先要找到一个大于4G的U盘&#xff…

猫头虎 解析:为什么AIGC在国内适合做TOB,在国外适合做TOC?

猫头虎 解析&#xff1a;为什么AIGC在国内适合做TOB&#xff0c;在国外适合做TOC&#xff1f; 博主 猫头虎 的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面…

ps进程查看命令详解

1、PS 命令是什么 查看它的man手册可以看到&#xff0c;ps命令能够给出当前系统中进程的快照。它能捕获系统在某一事件的进程状态。如果你想不断更新查看的这个状态&#xff0c;可以使用top命令。 2、ps命令支持三种使用的语法格式 UNIX 风格&#xff0c;选项可以组合在一起…

鸿蒙ArkUI-X平台差异化:【运行态差异化(@ohos.deviceInfo)】

平台差异化 简介 跨平台使用场景是一套ArkTS代码运行在多个终端设备上&#xff0c;如Android、iOS、OpenHarmony&#xff08;含基于OpenHarmony发行的商业版&#xff0c;如HarmonyOS Next&#xff09;。当不同平台业务逻辑不同&#xff0c;或使用了不支持跨平台的API&#xf…

c++中静态函数

在Qt中&#xff0c;可以通过在类中定义静态方法来添加静态方法。静态方法是类的一部分&#xff0c;但不需要实例化类对象就可以直接调用。 下面是一个示例&#xff0c;演示了如何在类中添加静态方法&#xff1a; cpp class MyClass { public: static void myStaticMethod…

Postman快捷功能-批量断言与快速查询替换

大家好&#xff0c;在我们日常的接口测试工作中&#xff0c;经常需要对接口返回的数据进行断言&#xff0c;以确保接口的正确性。当接口数量较多时&#xff0c;逐个编写断言语句会变得非常繁琐。此外&#xff0c;在接口测试过程中&#xff0c;我们还可能需要频繁地查找和替换某…

Python自动化工具(桌面自动化、Web自动化、游戏辅助)

工具介绍 连点工具是一款可以模拟键鼠后台操作的连点器工具。支持鼠标连点、键鼠脚本录制&#xff0c;支持辅助您实现办公自动化以及辅助游戏操作。功能简洁易用&#xff0c;非常方便操作。连点工具让您在在玩游戏、网购抢购的时候全自动点击鼠标&#xff01;主要功能有&#…

MySQL数据库的数据文件保存在哪?MySQL数据存在哪里

在安装好MySQL数据库使用一段时间后&#xff0c;会产生许多的数据库和数据。那这些数据库的数据文件存放在本地文件夹的什么位置呢 一、默认位置 一般来说MySQL数据库的数据文件都是存放在data文件夹之中&#xff0c;但是根据使用的存储引擎不同&#xff0c;产生的一些文件也…

牛客前端面试高频八股总结(2)(附文档)

1.fetch请求方式 fetch是什么&#xff1f; fetch是一种http 数据请求的方式&#xff0c;是xml的一种替代方式。 怎么请求&#xff1f; fetch方法返回一个promise解析response显示状态&#xff08;成功与否&#xff09;的方法。 优点&#xff1a; 使用Promise&#xff0c;支持链…