From 9991a013fdd0887a62f404a43559e9d66961c669 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 1 Feb 2010 14:45:11 +0000 Subject: [PATCH] TransactionInterceptor is able to serialize "transactionManagerBeanName" as well (SPR-6680) git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@2889 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../interceptor/TransactionAspectSupport.java | 16 ++++++++++++- .../interceptor/TransactionInterceptor.java | 7 +++++- .../config/AnnotationDrivenTests.java | 24 +++++++++++++++++-- .../config/TransactionalService.java | 7 +++--- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/org.springframework.transaction/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java b/org.springframework.transaction/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java index abb75ef452d..5c1d2dd6758 100644 --- a/org.springframework.transaction/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java +++ b/org.springframework.transaction/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 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. @@ -139,6 +139,13 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init this.transactionManagerBeanName = transactionManagerBeanName; } + /** + * Return the name of the default transaction manager bean. + */ + protected final String getTransactionManagerBeanName() { + return this.transactionManagerBeanName; + } + /** * Specify the target transaction manager. */ @@ -210,6 +217,13 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init this.beanFactory = beanFactory; } + /** + * Return the BeanFactory to use for retrieving PlatformTransactionManager beans. + */ + protected final BeanFactory getBeanFactory() { + return this.beanFactory; + } + /** * Check that required properties were set. */ diff --git a/org.springframework.transaction/src/main/java/org/springframework/transaction/interceptor/TransactionInterceptor.java b/org.springframework.transaction/src/main/java/org/springframework/transaction/interceptor/TransactionInterceptor.java index 725445634b7..a7ef513bd63 100644 --- a/org.springframework.transaction/src/main/java/org/springframework/transaction/interceptor/TransactionInterceptor.java +++ b/org.springframework.transaction/src/main/java/org/springframework/transaction/interceptor/TransactionInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 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. @@ -25,6 +25,7 @@ import java.util.Properties; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; +import org.springframework.beans.factory.BeanFactory; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.CallbackPreferringPlatformTransactionManager; @@ -173,8 +174,10 @@ public class TransactionInterceptor extends TransactionAspectSupport implements oos.defaultWriteObject(); // Deserialize superclass fields. + oos.writeObject(getTransactionManagerBeanName()); oos.writeObject(getTransactionManager()); oos.writeObject(getTransactionAttributeSource()); + oos.writeObject(getBeanFactory()); } private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { @@ -184,8 +187,10 @@ public class TransactionInterceptor extends TransactionAspectSupport implements // Serialize all relevant superclass fields. // Superclass can't implement Serializable because it also serves as base class // for AspectJ aspects (which are not allowed to implement Serializable)! + setTransactionManagerBeanName((String) ois.readObject()); setTransactionManager((PlatformTransactionManager) ois.readObject()); setTransactionAttributeSource((TransactionAttributeSource) ois.readObject()); + setBeanFactory((BeanFactory) ois.readObject()); } diff --git a/org.springframework.transaction/src/test/java/org/springframework/transaction/config/AnnotationDrivenTests.java b/org.springframework.transaction/src/test/java/org/springframework/transaction/config/AnnotationDrivenTests.java index 8ea43bb1bfe..1d3a237d839 100644 --- a/org.springframework.transaction/src/test/java/org/springframework/transaction/config/AnnotationDrivenTests.java +++ b/org.springframework.transaction/src/test/java/org/springframework/transaction/config/AnnotationDrivenTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 the original author or authors. + * Copyright 2002-2010 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. @@ -16,6 +16,8 @@ package org.springframework.transaction.config; +import java.io.Serializable; + import junit.framework.TestCase; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; @@ -24,6 +26,7 @@ import org.springframework.aop.support.AopUtils; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.transaction.CallCountingTransactionManager; import org.springframework.transaction.support.TransactionSynchronizationManager; +import org.springframework.util.SerializationTestUtils; /** * @author Rob Harrop @@ -51,14 +54,31 @@ public class AnnotationDrivenTests extends TestCase { assertEquals(2, tm2.commits); } + public void testSerializableWithPreviousUsage() throws Exception { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("annotationDrivenProxyTargetClassTests.xml", getClass()); + TransactionalService service = context.getBean("service", TransactionalService.class); + service.setSomething("someName"); + service = (TransactionalService) SerializationTestUtils.serializeAndDeserialize(service); + service.setSomething("someName"); + } - public static class TransactionCheckingInterceptor implements MethodInterceptor { + public void testSerializableWithoutPreviousUsage() throws Exception { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("annotationDrivenProxyTargetClassTests.xml", getClass()); + TransactionalService service = context.getBean("service", TransactionalService.class); + service = (TransactionalService) SerializationTestUtils.serializeAndDeserialize(service); + service.setSomething("someName"); + } + + + public static class TransactionCheckingInterceptor implements MethodInterceptor, Serializable { public Object invoke(MethodInvocation methodInvocation) throws Throwable { if (methodInvocation.getMethod().getName().equals("setSomething")) { + assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); assertTrue(TransactionSynchronizationManager.isSynchronizationActive()); } else { + assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); assertFalse(TransactionSynchronizationManager.isSynchronizationActive()); } return methodInvocation.proceed(); diff --git a/org.springframework.transaction/src/test/java/org/springframework/transaction/config/TransactionalService.java b/org.springframework.transaction/src/test/java/org/springframework/transaction/config/TransactionalService.java index 1c55e1c2220..e5d05728156 100644 --- a/org.springframework.transaction/src/test/java/org/springframework/transaction/config/TransactionalService.java +++ b/org.springframework.transaction/src/test/java/org/springframework/transaction/config/TransactionalService.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 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. @@ -16,14 +16,15 @@ package org.springframework.transaction.config; -import org.springframework.beans.factory.BeanNameAware; +import java.io.Serializable; + import org.springframework.transaction.annotation.Transactional; /** * @author Rob Harrop * @author Juergen Hoeller */ -public class TransactionalService { +public class TransactionalService implements Serializable { @Transactional("synch") public void setSomething(String name) {