DATAJPA-1026 - Adapt API in JpaRepositoryFactoryBean.

Related ticket: DATACMNS-891.
This commit is contained in:
Oliver Gierke
2016-12-15 16:16:30 +01:00
parent 1a54d065bd
commit db65da01b8
6 changed files with 40 additions and 49 deletions

View File

@@ -34,11 +34,20 @@ import org.springframework.util.Assert;
* @author Eberhard Wolff
* @param <T> the type of the repository
*/
public class JpaRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends
TransactionalRepositoryFactoryBeanSupport<T, S, ID> {
public class JpaRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable>
extends TransactionalRepositoryFactoryBeanSupport<T, S, ID> {
private EntityManager entityManager;
/**
* Creates a new {@link JpaRepositoryFactoryBean} for the given repository interface.
*
* @param repositoryInterface must not be {@literal null}.
*/
public JpaRepositoryFactoryBean(Class<? extends T> repositoryInterface) {
super(repositoryInterface);
}
/**
* The {@link EntityManager} to be used.
*

View File

@@ -76,10 +76,10 @@ public class JavaConfigUserRepositoryTests extends UserRepositoryTests {
extensions);
evaluationContextProvider.setApplicationContext(applicationContext);
JpaRepositoryFactoryBean<UserRepository, User, Integer> factory = new JpaRepositoryFactoryBean<UserRepository, User, Integer>();
JpaRepositoryFactoryBean<UserRepository, User, Integer> factory = new JpaRepositoryFactoryBean<UserRepository, User, Integer>(
UserRepository.class);
factory.setEntityManager(entityManager);
factory.setBeanFactory(applicationContext);
factory.setRepositoryInterface(UserRepository.class);
factory
.setCustomImplementation(new UserRepositoryImpl(new DefaultJpaContext(Collections.singleton(entityManager))));
factory.setNamedQueries(namedQueries());

View File

@@ -41,7 +41,6 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigUtils;
import org.springframework.data.repository.config.RepositoryConfigurationExtension;
import org.springframework.data.repository.config.RepositoryConfigurationSource;
import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport;
import org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor;
/**
@@ -52,8 +51,6 @@ import org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcesso
@RunWith(MockitoJUnitRunner.class)
public class JpaRepositoryConfigExtensionUnitTests {
private static final String RIABPP_CLASS_NAME = RepositoryFactoryBeanSupport.class.getName().concat("_Predictor");
@Mock RepositoryConfigurationSource configSource;
public @Rule ExpectedException exception = ExpectedException.none();
@@ -68,7 +65,7 @@ public class JpaRepositoryConfigExtensionUnitTests {
Iterable<String> names = Arrays.asList(factory.getBeanDefinitionNames());
assertThat(names, hasItems(AnnotationConfigUtils.PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME, RIABPP_CLASS_NAME));
assertThat(names, hasItems(AnnotationConfigUtils.PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
}
@Test

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2008-2011 the original author or authors.
* Copyright 2008-2016 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.
@@ -29,8 +29,12 @@ import org.springframework.data.repository.core.support.RepositoryFactorySupport
* @author Gil Markham
* @author Oliver Gierke
*/
public class CustomGenericJpaRepositoryFactoryBean<T extends JpaRepository<Object, Serializable>> extends
JpaRepositoryFactoryBean<T, Object, Serializable> {
public class CustomGenericJpaRepositoryFactoryBean<T extends JpaRepository<Object, Serializable>>
extends JpaRepositoryFactoryBean<T, Object, Serializable> {
public CustomGenericJpaRepositoryFactoryBean(Class<? extends T> repositoryInterface) {
super(repositoryInterface);
}
/*
* (non-Javadoc)

View File

@@ -51,18 +51,12 @@ public class JpaRepositoryFactoryBeanUnitTests {
JpaRepositoryFactoryBean<SimpleSampleRepository, User, Integer> factoryBean;
@Mock
EntityManager entityManager;
@Mock
RepositoryFactorySupport factory;
@Mock
ListableBeanFactory beanFactory;
@Mock
PersistenceExceptionTranslator translator;
@Mock
Repository<?, ?> repository;
@Mock
Metamodel metamodel;
@Mock EntityManager entityManager;
@Mock RepositoryFactorySupport factory;
@Mock ListableBeanFactory beanFactory;
@Mock PersistenceExceptionTranslator translator;
@Mock Repository<?, ?> repository;
@Mock Metamodel metamodel;
@Before
@SuppressWarnings("unchecked")
@@ -70,14 +64,14 @@ public class JpaRepositoryFactoryBeanUnitTests {
Map<String, PersistenceExceptionTranslator> beans = new HashMap<String, PersistenceExceptionTranslator>();
beans.put("foo", translator);
when(beanFactory.getBeansOfType(eq(PersistenceExceptionTranslator.class), anyBoolean(), anyBoolean())).thenReturn(
beans);
when(beanFactory.getBeansOfType(eq(PersistenceExceptionTranslator.class), anyBoolean(), anyBoolean()))
.thenReturn(beans);
when(factory.getRepository(any(Class.class), any(Object.class))).thenReturn(repository);
when(entityManager.getMetamodel()).thenReturn(metamodel);
// Setup standard factory configuration
factoryBean = new DummyJpaRepositoryFactoryBean<SimpleSampleRepository, User, Integer>();
factoryBean.setRepositoryInterface(SimpleSampleRepository.class);
factoryBean = new DummyJpaRepositoryFactoryBean<SimpleSampleRepository, User, Integer>(
SimpleSampleRepository.class);
factoryBean.setEntityManager(entityManager);
}
@@ -107,34 +101,22 @@ public class JpaRepositoryFactoryBeanUnitTests {
*/
@Test(expected = IllegalArgumentException.class)
public void preventsNullRepositoryInterface() {
factoryBean.setRepositoryInterface(null);
new JpaRepositoryFactoryBean<Repository<Object, Long>, Object, Long>(null);
}
/**
* Assert that the factory detects unset repository class and interface in
* {@code JpaRepositoryFactoryBean#afterPropertiesSet()}.
*/
@Test(expected = IllegalArgumentException.class)
public void preventsUnsetRepositoryInterface() throws Exception {
private class DummyJpaRepositoryFactoryBean<T extends JpaRepository<S, ID>, S, ID extends Serializable>
extends JpaRepositoryFactoryBean<T, S, ID> {
factoryBean = new JpaRepositoryFactoryBean<SimpleSampleRepository, User, Integer>();
factoryBean.afterPropertiesSet();
}
private class DummyJpaRepositoryFactoryBean<T extends JpaRepository<S, ID>, S, ID extends Serializable> extends
JpaRepositoryFactoryBean<T, S, ID> {
public DummyJpaRepositoryFactoryBean(Class<? extends T> repositoryInterface) {
super(repositoryInterface);
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean
* #createRepositoryFactory()
* @see org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean#doCreateRepositoryFactory()
*/
@Override
protected RepositoryFactorySupport doCreateRepositoryFactory() {
return factory;
}
}

View File

@@ -10,7 +10,7 @@
<!-- Configure a DAO for User class -->
<bean id="userDao" class="org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean">
<property name="repositoryInterface" value="org.springframework.data.jpa.repository.sample.UserRepository" />
<constructor-arg value="org.springframework.data.jpa.repository.sample.UserRepository" />
<property name="customImplementation">
<bean class="org.springframework.data.jpa.repository.sample.UserRepositoryImpl">
<constructor-arg>
@@ -25,12 +25,11 @@
</constructor-arg>
</bean>
</property>
<property name="evaluationContextProvider" ref="expressionEvaluationContextProvider"/>
</bean>
<bean id="roleDao" class="org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean">
<property name="repositoryInterface" value="org.springframework.data.jpa.repository.sample.RoleRepository" />
<constructor-arg value="org.springframework.data.jpa.repository.sample.RoleRepository" />
<property name="evaluationContextProvider" ref="expressionEvaluationContextProvider"/>
</bean>