diff --git a/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBean.java b/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBean.java index 20b51987..fc799df7 100644 --- a/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBean.java +++ b/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBean.java @@ -16,8 +16,10 @@ package org.springframework.data.r2dbc.repository.support; import java.io.Serializable; +import java.util.Optional; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.data.mapping.context.MappingContext; @@ -27,7 +29,8 @@ import org.springframework.data.r2dbc.core.ReactiveDataAccessStrategy; import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport; import org.springframework.data.repository.core.support.RepositoryFactorySupport; -import org.springframework.data.repository.query.ReactiveQueryMethodEvaluationContextProvider; +import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider; +import org.springframework.data.repository.query.ReactiveExtensionAwareQueryMethodEvaluationContextProvider; import org.springframework.lang.Nullable; import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.util.Assert; @@ -58,7 +61,6 @@ public class R2dbcRepositoryFactoryBean, S, ID exten */ public R2dbcRepositoryFactoryBean(Class repositoryInterface) { super(repositoryInterface); - setEvaluationContextProvider(ReactiveQueryMethodEvaluationContextProvider.DEFAULT); } /** @@ -104,6 +106,16 @@ public class R2dbcRepositoryFactoryBean, S, ID exten : getFactoryInstance(this.client, this.dataAccessStrategy); } + /* + * (non-Javadoc) + * @see org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport#createDefaultQueryMethodEvaluationContextProvider(ListableBeanFactory) + */ + @Override + protected Optional createDefaultQueryMethodEvaluationContextProvider( + ListableBeanFactory beanFactory) { + return Optional.of(new ReactiveExtensionAwareQueryMethodEvaluationContextProvider(beanFactory)); + } + /** * Creates and initializes a {@link RepositoryFactorySupport} instance. * diff --git a/src/test/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBeanUnitTests.java b/src/test/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBeanUnitTests.java new file mode 100644 index 00000000..b852f790 --- /dev/null +++ b/src/test/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBeanUnitTests.java @@ -0,0 +1,61 @@ +/* + * Copyright 2021 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.r2dbc.repository.support; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; +import org.springframework.data.r2dbc.dialect.H2Dialect; +import org.springframework.data.r2dbc.repository.R2dbcRepository; +import org.springframework.data.repository.query.ReactiveExtensionAwareQueryMethodEvaluationContextProvider; +import org.springframework.r2dbc.core.DatabaseClient; +import org.springframework.test.util.ReflectionTestUtils; + +/** + * Unit tests for {@link R2dbcRepositoryFactoryBean}. + * + * @author Mark Paluch + */ +class R2dbcRepositoryFactoryBeanUnitTests { + + @Test // #658 + void shouldConfigureReactiveExtensionAwareQueryMethodEvaluationContextProvider() { + + R2dbcRepositoryFactoryBean factoryBean = new R2dbcRepositoryFactoryBean<>( + PersonRepository.class); + factoryBean.setBeanFactory(mock(ListableBeanFactory.class)); + R2dbcEntityTemplate operations = new R2dbcEntityTemplate(mock(DatabaseClient.class), H2Dialect.INSTANCE); + factoryBean.setEntityOperations(operations); + factoryBean.setLazyInit(true); + factoryBean.afterPropertiesSet(); + + Object factory = ReflectionTestUtils.getField(factoryBean, "factory"); + Object evaluationContextProvider = ReflectionTestUtils.getField(factory, "evaluationContextProvider"); + + assertThat(evaluationContextProvider).isInstanceOf(ReactiveExtensionAwareQueryMethodEvaluationContextProvider.class) + .isNotEqualTo(ReactiveExtensionAwareQueryMethodEvaluationContextProvider.DEFAULT); + } + + static class Person {} + + interface PersonRepository extends R2dbcRepository + + {} +}