Browse Source

PersistenceAnnotationBeanPostProcessor defensively handles BeanDefinition access for extended EntityManagers

Issue: SPR-8834
pull/606/merge
Juergen Hoeller 10 years ago
parent
commit
592e344191
  1. 6
      spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java
  2. 22
      spring-orm/src/test/java/org/springframework/orm/jpa/support/PersistenceInjectionTests.java

6
spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java

@ -1,5 +1,5 @@ @@ -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 @@ -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;

22
spring-orm/src/test/java/org/springframework/orm/jpa/support/PersistenceInjectionTests.java

@ -1,5 +1,5 @@ @@ -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 @@ -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();

Loading…
Cancel
Save