Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.5.5-SNAPSHOT</version>
<version>2.5.x-GH-2455-SNAPSHOT</version>

<name>Spring Data Core</name>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package org.springframework.data.config;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.xml.XmlReaderContext;
import org.springframework.core.io.ResourceLoader;
Expand Down Expand Up @@ -101,4 +102,12 @@ public static String getRequiredBeanClassName(BeanDefinition beanDefinition) {

return result;
}

static Class<?> getFactoryBeanObjectType(BeanDefinition beanDefinition) {

if(!beanDefinition.hasAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE)) {
return null;
}
return Class.class.cast(beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,11 @@ public String getResourceDescription() {
return String.format("@%s declared on %s", annoationClassName, simpleClassName);
}

@Override
public ResourceLoader getResourceLoader() {
return resourceLoader;
}

private Streamable<TypeFilter> parseFilters(String attributeName) {

AnnotationAttributes[] filters = attributes.getAnnotationArray(attributeName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,21 @@ public String getRepositoryInterface() {
return ConfigurationUtils.getRequiredBeanClassName(definition);
}

public Class<?> getRepositoryInterfaceType() {

Class<?> target = ConfigurationUtils.getFactoryBeanObjectType(definition);
if(target != null) {
return target;
}

try {
return ClassUtils.forName(getRepositoryInterface(), ConfigurationUtils.getRequiredClassLoader(this.getConfigurationSource().getResourceLoader()));
} catch (ClassNotFoundException e) {

}
return null;
}

/*
* (non-Javadoc)
* @see org.springframework.data.repository.config.RepositoryConfiguration#getConfigSource()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ public interface RepositoryConfiguration<T extends RepositoryConfigurationSource
*/
String getRepositoryInterface();

Class<?> getRepositoryInterfaceType();

/**
* Returns the key to resolve a {@link QueryLookupStrategy} from eventually.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.config.DependencyDescriptor;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
Expand All @@ -46,6 +47,7 @@
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.StopWatch;

/**
Expand All @@ -65,8 +67,6 @@ public class RepositoryConfigurationDelegate {
private static final String MULTIPLE_MODULES = "Multiple Spring Data modules found, entering strict repository configuration mode!";
private static final String NON_DEFAULT_AUTOWIRE_CANDIDATE_RESOLVER = "Non-default AutowireCandidateResolver (%s) detected. Skipping the registration of LazyRepositoryInjectionPointResolver. Lazy repository injection will not be working!";

static final String FACTORY_BEAN_OBJECT_TYPE = "factoryBeanObjectType";

private static final Log logger = LogFactory.getLog(RepositoryConfigurationDelegate.class);

private final RepositoryConfigurationSource configurationSource;
Expand Down Expand Up @@ -182,9 +182,16 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
if (logger.isTraceEnabled()) {
logger.trace(LogMessage.format(REPOSITORY_REGISTRATION, extension.getModuleName(), beanName, configuration.getRepositoryInterface(),
configuration.getRepositoryFactoryBeanClassName()));
}

beanDefinition.setAttribute(FACTORY_BEAN_OBJECT_TYPE, configuration.getRepositoryInterface());
}
{
Class<?> repositoryInterfaceType = configuration.getRepositoryInterfaceType();
if(repositoryInterfaceType != null) {
beanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, repositoryInterfaceType);
} else {
beanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, configuration.getRepositoryInterface());
}
}

registry.registerBeanDefinition(beanName, beanDefinition);
definitions.add(new BeanComponentDefinition(beanDefinition, beanName));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,4 +180,6 @@ default <T> T getRequiredAttribute(String name, Class<T> type) {
*/
@Nullable
String getResourceDescription();

ResourceLoader getResourceLoader();
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.filter.TypeFilter;
import org.springframework.data.config.ConfigurationUtils;
import org.springframework.data.config.TypeFilterParser;
Expand Down Expand Up @@ -273,4 +274,9 @@ private static BeanNameGenerator defaultBeanNameGenerator(@Nullable BeanNameGene
? new AnnotationBeanNameGenerator() //
: generator;
}

@Override
public ResourceLoader getResourceLoader() {
return context.getReaderContext().getResourceLoader();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;

import org.springframework.aop.TargetSource;
import org.springframework.aop.framework.Advised;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
Expand All @@ -37,7 +37,6 @@
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.metrics.ApplicationStartup;
import org.springframework.core.metrics.StartupStep;
import org.springframework.core.type.StandardAnnotationMetadata;
import org.springframework.data.repository.config.RepositoryConfigurationDelegate.LazyRepositoryInjectionPointResolver;
import org.springframework.data.repository.sample.AddressRepository;
Expand All @@ -56,8 +55,8 @@ class RepositoryConfigurationDelegateUnitTests {

@Mock RepositoryConfigurationExtension extension;

@Test // DATACMNS-892
void registersRepositoryBeanNameAsAttribute() {
@Test // DATACMNS-892, GH-2455
void registersRepositoryBeanTargetTypeAsAttribute() {

StandardEnvironment environment = new StandardEnvironment();
GenericApplicationContext context = new GenericApplicationContext();
Expand All @@ -72,8 +71,10 @@ void registersRepositoryBeanNameAsAttribute() {

BeanDefinition beanDefinition = definition.getBeanDefinition();

assertThat(beanDefinition.getAttribute(RepositoryConfigurationDelegate.FACTORY_BEAN_OBJECT_TYPE).toString())
.endsWith("Repository");
assertThat(beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE)).satisfies(it -> {
assertThat(it).isInstanceOf(Class.class);
assertThat(it.toString()).endsWith("Repository");
});
}
}

Expand Down