PersistenceAnnotationBeanPostProcessor defensively handles BeanDefinition access for extended EntityManagers
Issue: SPR-8834
This commit is contained in:
parent
9d3d6d5919
commit
592e344191
|
@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -713,8 +713,8 @@ public class PersistenceAnnotationBeanPostProcessor
|
||||||
em = ExtendedEntityManagerCreator.createContainerManagedEntityManager(
|
em = ExtendedEntityManagerCreator.createContainerManagedEntityManager(
|
||||||
emf, this.properties, this.synchronizedWithTransaction);
|
emf, this.properties, this.synchronizedWithTransaction);
|
||||||
}
|
}
|
||||||
if (em instanceof EntityManagerProxy &&
|
if (em instanceof EntityManagerProxy && beanFactory != null &&
|
||||||
beanFactory != null && !beanFactory.isPrototype(requestingBeanName)) {
|
beanFactory.containsBean(requestingBeanName) && !beanFactory.isPrototype(requestingBeanName)) {
|
||||||
extendedEntityManagersToClose.put(target, ((EntityManagerProxy) em).getTargetEntityManager());
|
extendedEntityManagersToClose.put(target, ((EntityManagerProxy) em).getTargetEntityManager());
|
||||||
}
|
}
|
||||||
return em;
|
return em;
|
||||||
|
|
|
@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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();
|
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
|
@Test
|
||||||
public void testPublicExtendedPersistenceContextSetterWithSerialization() throws Exception {
|
public void testPublicExtendedPersistenceContextSetterWithSerialization() throws Exception {
|
||||||
DummyInvocationHandler ih = new DummyInvocationHandler();
|
DummyInvocationHandler ih = new DummyInvocationHandler();
|
||||||
|
|
Loading…
Reference in New Issue