From f9657a100b2f0b0e087d4733a83ee9d2b5fbf186 Mon Sep 17 00:00:00 2001 From: Sergey Korotaev Date: Wed, 11 Jun 2025 22:03:53 +0300 Subject: [PATCH] Added setting mappingContext and mappingConfiguration in afterPropertiesSet() and removed Autowired Signed-off-by: Sergey Korotaev --- .../support/JdbcRepositoryFactoryBean.java | 18 ++++++++++++------ .../JdbcRepositoryFactoryBeanUnitTests.java | 14 ++++++++++---- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBean.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBean.java index 786f32f373..ae0683e755 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBean.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBean.java @@ -16,9 +16,7 @@ package org.springframework.data.jdbc.repository.support; import java.io.Serializable; - import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.data.jdbc.core.convert.DataAccessStrategy; @@ -49,6 +47,7 @@ * @author Hebert Coelho * @author Chirag Tailor * @author Mikhail Polivakha + * @author Sergey Korotaev */ public class JdbcRepositoryFactoryBean, S, ID extends Serializable> extends TransactionalRepositoryFactoryBeanSupport implements ApplicationEventPublisherAware { @@ -58,7 +57,7 @@ public class JdbcRepositoryFactoryBean, S, ID extend private RelationalMappingContext mappingContext; private JdbcConverter converter; private DataAccessStrategy dataAccessStrategy; - private QueryMappingConfiguration queryMappingConfiguration = QueryMappingConfiguration.EMPTY; + private QueryMappingConfiguration queryMappingConfiguration; private NamedParameterJdbcOperations operations; private EntityCallbacks entityCallbacks; private Dialect dialect; @@ -124,7 +123,6 @@ public void setDataAccessStrategy(DataAccessStrategy dataAccessStrategy) { * @param queryMappingConfiguration can be {@literal null}. {@link #afterPropertiesSet()} defaults to * {@link QueryMappingConfiguration#EMPTY} if {@literal null}. */ - @Autowired(required = false) public void setQueryMappingConfiguration(QueryMappingConfiguration queryMappingConfiguration) { Assert.notNull(queryMappingConfiguration, "QueryMappingConfiguration must not be null"); @@ -157,9 +155,14 @@ public void setBeanFactory(BeanFactory beanFactory) { @Override public void afterPropertiesSet() { - Assert.state(this.mappingContext != null, "MappingContext is required and must not be null"); Assert.state(this.converter != null, "RelationalConverter is required and must not be null"); + if (mappingContext == null) { + Assert.state(beanFactory != null, "If no MappingContext are set a BeanFactory must be available"); + + this.mappingContext = beanFactory.getBean(RelationalMappingContext.class); + } + if (this.operations == null) { Assert.state(beanFactory != null, "If no JdbcOperations are set a BeanFactory must be available"); @@ -168,7 +171,10 @@ public void afterPropertiesSet() { } if (this.queryMappingConfiguration == null) { - this.queryMappingConfiguration = QueryMappingConfiguration.EMPTY; + Assert.state(beanFactory != null, "If no QueryMappingConfiguration are set a BeanFactory must be available"); + + this.queryMappingConfiguration = beanFactory.getBeanProvider(QueryMappingConfiguration.class) + .getIfAvailable(() -> QueryMappingConfiguration.EMPTY); } if (this.dataAccessStrategy == null) { diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBeanUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBeanUnitTests.java index 3433864f7f..4c567f78a7 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBeanUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactoryBeanUnitTests.java @@ -78,9 +78,14 @@ public void setUp() { when(beanFactory.getBean(NamedParameterJdbcOperations.class)).thenReturn(mock(NamedParameterJdbcOperations.class)); - ObjectProvider provider = mock(ObjectProvider.class); - when(beanFactory.getBeanProvider(DataAccessStrategy.class)).thenReturn(provider); - when(provider.getIfAvailable(any())) + ObjectProvider dataAccessStrategyObjectProvider = mock(ObjectProvider.class); + ObjectProvider queryMappingConfigurationObjectProvider = mock(ObjectProvider.class); + when(beanFactory.getBeanProvider(DataAccessStrategy.class)).thenReturn(dataAccessStrategyObjectProvider); + when(beanFactory.getBeanProvider(QueryMappingConfiguration.class)).thenReturn(queryMappingConfigurationObjectProvider); + when(beanFactory.getBean(RelationalMappingContext.class)).thenReturn(mappingContext); + when(dataAccessStrategyObjectProvider.getIfAvailable(any())) + .then((Answer) invocation -> ((Supplier) invocation.getArgument(0)).get()); + when(queryMappingConfigurationObjectProvider.getIfAvailable(any())) .then((Answer) invocation -> ((Supplier) invocation.getArgument(0)).get()); } @@ -114,7 +119,6 @@ public void afterPropertiesThrowsExceptionWhenNoMappingContextSet() { @Test // DATAJDBC-155 public void afterPropertiesSetDefaultsNullablePropertiesCorrectly() { - factoryBean.setMappingContext(mappingContext); factoryBean.setConverter(new MappingJdbcConverter(mappingContext, dataAccessStrategy)); factoryBean.setApplicationEventPublisher(publisher); factoryBean.setBeanFactory(beanFactory); @@ -126,6 +130,8 @@ public void afterPropertiesSetDefaultsNullablePropertiesCorrectly() { .isInstanceOf(DefaultDataAccessStrategy.class); assertThat(ReflectionTestUtils.getField(factoryBean, "queryMappingConfiguration")) .isEqualTo(QueryMappingConfiguration.EMPTY); + assertThat(ReflectionTestUtils.getField(factoryBean, "mappingContext")) + .isEqualTo(mappingContext); } private static class DummyEntity {