From fd583c1e1507dff241c30ae981ca0b6fdb3d8d13 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Sun, 4 Sep 2016 12:57:18 +0200 Subject: [PATCH] DATAJPA-956 - Fixed accidental pick up of non-EntityManagerFactor JNDI objects. We now exclude all candidates beans that could theoretically become an EntityManagerFactory unless we definitely know so. Previously bean definitions for JndiObjectFactoryBean that didn't expose an expected type (e.g. ones defined via JavaConfig) were propagated to the creation of a DefaultJpaContext. --- .../data/jpa/util/BeanDefinitionUtils.java | 2 ++ .../DefaultJpaContextIntegrationTests.java | 23 ++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/jpa/util/BeanDefinitionUtils.java b/src/main/java/org/springframework/data/jpa/util/BeanDefinitionUtils.java index e8780376e..f93c8d75d 100644 --- a/src/main/java/org/springframework/data/jpa/util/BeanDefinitionUtils.java +++ b/src/main/java/org/springframework/data/jpa/util/BeanDefinitionUtils.java @@ -127,6 +127,8 @@ public class BeanDefinitionUtils { if (!EntityManagerFactory.class.getName().equals(definition.getPropertyValues().get("expectedType"))) { return; } + } else if (!EntityManagerFactory.class.equals(beanFactory.getType(name))) { + return; } definitions.add(new EntityManagerFactoryBeanDefinition(name, beanFactory)); diff --git a/src/test/java/org/springframework/data/jpa/repository/support/DefaultJpaContextIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/support/DefaultJpaContextIntegrationTests.java index e5b9eb1e4..b92de1733 100644 --- a/src/test/java/org/springframework/data/jpa/repository/support/DefaultJpaContextIntegrationTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/support/DefaultJpaContextIntegrationTests.java @@ -17,12 +17,15 @@ package org.springframework.data.jpa.repository.support; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import static org.mockito.Mockito.*; import java.util.Arrays; import java.util.HashSet; +import javax.naming.NamingException; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; import org.junit.Before; import org.junit.BeforeClass; @@ -44,6 +47,8 @@ import org.springframework.data.jpa.repository.JpaContext; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.jndi.JndiObjectFactoryBean; +import org.springframework.mock.jndi.ExpectedLookupTemplate; import org.springframework.mock.jndi.SimpleNamingContextBuilder; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.stereotype.Component; @@ -113,6 +118,7 @@ public class DefaultJpaContextIntegrationTests { /** * @see DATAJPA-813 + * @see DATAJPA-956 */ @Test public void bootstrapsDefaultJpaContextInSpringContainer() { @@ -163,7 +169,7 @@ public class DefaultJpaContextIntegrationTests { } @EnableJpaRepositories - @ComponentScan(includeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, value = ApplicationComponent.class) , + @ComponentScan(includeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, value = ApplicationComponent.class), useDefaultFilters = false) static class Config { @@ -171,6 +177,21 @@ public class DefaultJpaContextIntegrationTests { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { return createEntityManagerFactoryBean("spring-data-jpa"); } + + // A non-EntityManagerFactory JNDI object to make sure the detection doesn't include it + // @see DATAJPA-956 + + @Bean + public JndiObjectFactoryBean jndiObject() throws NamingException { + + JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); + + bean.setJndiName("some/DataSource"); + bean.setJndiTemplate(new ExpectedLookupTemplate("some/DataSource", mock(DataSource.class))); + bean.setExpectedType(DataSource.class); + + return bean; + } } @Component