From 592e3441915ec8d59e2a4378bc9e62872fef343c Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 20 Aug 2014 11:14:51 +0200 Subject: [PATCH] PersistenceAnnotationBeanPostProcessor defensively handles BeanDefinition access for extended EntityManagers Issue: SPR-8834 --- ...ersistenceAnnotationBeanPostProcessor.java | 6 ++--- .../support/PersistenceInjectionTests.java | 22 ++++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java b/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java index 51ee76472a..9def582587 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 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. @@ -713,8 +713,8 @@ public class PersistenceAnnotationBeanPostProcessor em = ExtendedEntityManagerCreator.createContainerManagedEntityManager( emf, this.properties, this.synchronizedWithTransaction); } - if (em instanceof EntityManagerProxy && - beanFactory != null && !beanFactory.isPrototype(requestingBeanName)) { + if (em instanceof EntityManagerProxy && beanFactory != null && + beanFactory.containsBean(requestingBeanName) && !beanFactory.isPrototype(requestingBeanName)) { extendedEntityManagersToClose.put(target, ((EntityManagerProxy) em).getTargetEntityManager()); } return em; diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/support/PersistenceInjectionTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/support/PersistenceInjectionTests.java index 81d936b85c..04c4ce0ac3 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/support/PersistenceInjectionTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/support/PersistenceInjectionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 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. @@ -140,6 +140,26 @@ public class PersistenceInjectionTests extends AbstractEntityManagerFactoryBeanT verify(mockEm2).flush(); } + @Test + public void testInjectionIntoExistingObjects() { + EntityManager mockEm = mock(EntityManager.class); + given(mockEmf.createEntityManager()).willReturn(mockEm); + + GenericApplicationContext gac = new GenericApplicationContext(); + gac.getDefaultListableBeanFactory().registerSingleton("entityManagerFactory", mockEmf); + gac.registerBeanDefinition("annotationProcessor", + new RootBeanDefinition(PersistenceAnnotationBeanPostProcessor.class)); + gac.refresh(); + + DefaultPrivatePersistenceContextField existingBean1 = new DefaultPrivatePersistenceContextField(); + gac.getAutowireCapableBeanFactory().autowireBean(existingBean1); + assertNotNull(existingBean1.em); + + DefaultPublicPersistenceContextSetter existingBean2 = new DefaultPublicPersistenceContextSetter(); + gac.getAutowireCapableBeanFactory().autowireBean(existingBean2); + assertNotNull(existingBean2.em); + } + @Test public void testPublicExtendedPersistenceContextSetterWithSerialization() throws Exception { DummyInvocationHandler ih = new DummyInvocationHandler();