diff --git a/kernel-core/src/main/java/cn/stylefeng/roses/core/aop/RequestDataAop.java b/kernel-core/src/main/java/cn/stylefeng/roses/core/aop/RequestDataAop.java
index ae209cdc602d812d06ecc0891ed4317cd8378c3b..af7f7e97b90348452551d20f66fb0688f0be2d1b 100644
--- a/kernel-core/src/main/java/cn/stylefeng/roses/core/aop/RequestDataAop.java
+++ b/kernel-core/src/main/java/cn/stylefeng/roses/core/aop/RequestDataAop.java
@@ -50,18 +50,10 @@ public class RequestDataAop {
}
}
- //是否需要删除ThreadLocal的标识,如果proceed()过程中有异常
- //会执行ExceptionHandler,并在ExceptionHandler中清除ThreadLocal中的内容
- boolean needToRemove = true;
- try {
- return point.proceed();
- } catch (Throwable exception) {
- needToRemove = false;
- throw exception;
- } finally {
- if (needToRemove) {
- RequestDataHolder.remove();
- }
- }
+ // 如果 joint 顺利执行,则清空 RequestDataHolder
+ Object result = point.proceed();
+ RequestDataHolder.remove();
+
+ return result;
}
}
diff --git a/kernel-core/src/test/java/cn/stylefeng/roses/core/aop/RequestDataAopTest.java b/kernel-core/src/test/java/cn/stylefeng/roses/core/aop/RequestDataAopTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f43add1cef1e09da3ddf0f7b4297f14ad04b53c
--- /dev/null
+++ b/kernel-core/src/test/java/cn/stylefeng/roses/core/aop/RequestDataAopTest.java
@@ -0,0 +1,75 @@
+package cn.stylefeng.roses.core.aop;
+
+import cn.stylefeng.roses.core.context.RequestDataHolder;
+import cn.stylefeng.roses.core.reqres.request.RequestData;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.assertj.core.api.Assertions;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import static junit.framework.TestCase.assertSame;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.*;
+
+public class RequestDataAopTest {
+
+ @Test
+ public void testNoArgNoReturn() throws Throwable {
+ ProceedingJoinPoint joinPoint = mock(ProceedingJoinPoint.class);
+ when(joinPoint.getArgs()).thenReturn(new Object[0]);
+ when(joinPoint.proceed()).thenReturn(null);
+
+ RequestDataAop rda = new RequestDataAop();
+ Object result = rda.sessionKit(joinPoint);
+
+ assertThat(result).isNull();
+ assertThat(RequestDataHolder.get()).isNull();
+ }
+
+ @Test
+ public void testRequestDataArg() throws Throwable {
+ RequestData requestData = new RequestData();
+ ProceedingJoinPoint joinPoint = mock(ProceedingJoinPoint.class);
+ when(joinPoint.getArgs()).thenReturn(new Object[] {requestData});
+
+ when(joinPoint.proceed()).then(invocationOnMock -> {
+ assertSame(requestData, RequestDataHolder.get()); // 确认参数放到 RequestDataHolder 里面
+ return null;
+ });
+
+ RequestDataAop rda = new RequestDataAop();
+ Object result = rda.sessionKit(joinPoint);
+
+ assertThat(result).isNull();
+ assertThat(RequestDataHolder.get()).isNull(); // 确认参数清除了
+ }
+
+ @Test
+ public void testException() throws Throwable {
+ RequestData requestData = new RequestData();
+ ProceedingJoinPoint joinPoint = mock(ProceedingJoinPoint.class);
+ when(joinPoint.getArgs()).thenReturn(new Object[] {requestData});
+
+ Exception exception = new Exception();
+ when(joinPoint.proceed()).then(invocationOnMock -> {
+ assertSame(requestData, RequestDataHolder.get()); // 确认参数放到 RequestDataHolder 里面
+ throw exception;
+ });
+
+ RequestDataAop rda = new RequestDataAop();
+ Object result = null;
+
+ try {
+ result = rda.sessionKit(joinPoint);
+ } catch (Throwable throwable) {
+ assertSame(throwable, exception);
+ }
+
+ assertThat(result).isNull();
+ assertSame(requestData, RequestDataHolder.get()); // 确认参数没有清除
+ }
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index fd117cb482d13abbbb696b3dbf3deec77890a685..aa218d9cd2530f23a1269d97696ae01b1d3da5ae 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,14 @@
1.18.0
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+