Permalink
Browse files

DATAJPA-268 - LockModePopulatingMethodInterceptor cleans up resources…

… correctly.

LockModePopulatingMethodInterceptor now safely unbinds the LockModeMetadata after the target method invocation completes.
  • Loading branch information...
1 parent 8011ad9 commit 688f62516b3f609a102f910eccbc7d8690f16960 @olivergierke olivergierke committed Nov 6, 2012
View
8 ...java/org/springframework/data/jpa/repository/support/LockModeRepositoryPostProcessor.java
@@ -67,7 +67,7 @@ public LockMetadataProvider getLockMetadataProvider() {
* @see ThreadBoundLockMetadata
* @author Oliver Gierke
*/
- private static enum LockModePopulatingMethodIntercceptor implements MethodInterceptor {
+ static enum LockModePopulatingMethodIntercceptor implements MethodInterceptor {
INSTANCE;
@@ -88,7 +88,11 @@ public Object invoke(MethodInvocation invocation) throws Throwable {
LockModeType lockMode = (LockModeType) AnnotationUtils.getValue(annotation);
TransactionSynchronizationManager.bindResource(method, lockMode == null ? NULL : lockMode);
- return invocation.proceed();
+ try {
+ return invocation.proceed();
+ } finally {
+ TransactionSynchronizationManager.unbindResource(method);
+ }
}
}
View
66 ...ngframework/data/jpa/repository/support/LockModePopulatingMethodInterceptorUnitTests.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.data.jpa.repository.support;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import java.lang.reflect.Method;
+
+import javax.persistence.LockModeType;
+
+import org.aopalliance.intercept.MethodInvocation;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor.LockModePopulatingMethodIntercceptor;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+/**
+ * Unit tests for {@link LockModePopulatingMethodIntercceptor}.
+ *
+ * @author Oliver Gierke
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class LockModePopulatingMethodInterceptorUnitTests {
+
+ @Mock
+ MethodInvocation invocation;
+
+ /**
+ * @see DATAJPA-268
+ */
+ @Test
+ public void cleansUpBoundResources() throws Throwable {
+
+ Method method = Sample.class.getMethod("someMethod");
+ when(invocation.getMethod()).thenReturn(method);
+
+ LockModePopulatingMethodIntercceptor interceptor = LockModePopulatingMethodIntercceptor.INSTANCE;
+ interceptor.invoke(invocation);
+
+ assertThat(TransactionSynchronizationManager.getResource(method), is(nullValue()));
+ }
+
+ interface Sample {
+
+ @Lock(LockModeType.OPTIMISTIC)
+ void someMethod();
+ }
+}

0 comments on commit 688f625

Please sign in to comment.