Polishing.

Add reactive Query by Example and reactive/imperative Querydsl type hints.

See #2717
Original pull request: #2720
This commit is contained in:
Mark Paluch
2022-10-19 11:44:31 +02:00
parent c2293efb02
commit 0e57ea8872

View File

@@ -24,7 +24,11 @@ import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.aot.hint.TypeReference;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.core.io.InputStreamSource;
import org.springframework.data.domain.Example;
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.querydsl.QuerydslUtils;
import org.springframework.data.querydsl.ReactiveQuerydslPredicateExecutor;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport;
import org.springframework.data.repository.core.support.RepositoryFragment;
@@ -34,17 +38,25 @@ import org.springframework.data.repository.query.FluentQuery;
import org.springframework.data.repository.query.FluentQuery.FetchableFluentQuery;
import org.springframework.data.repository.query.FluentQuery.ReactiveFluentQuery;
import org.springframework.data.repository.query.QueryByExampleExecutor;
import org.springframework.data.repository.query.ReactiveQueryByExampleExecutor;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;
import com.querydsl.core.types.Predicate;
/**
* {@link RuntimeHintsRegistrar} holding required hints to bootstrap data repositories. <br />
* Already registered via {@literal aot.factories}.
*
* @author Christoph Strobl
* @author Mark Paluch
* @since 3.0
*/
class RepositoryRuntimeHints implements RuntimeHintsRegistrar {
private static final boolean PROJECT_REACTOR_PRESENT = ClassUtils.isPresent("reactor.core.publisher.Flux",
RepositoryRuntimeHints.class.getClassLoader());
@Override
public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) {
@@ -54,16 +66,45 @@ class RepositoryRuntimeHints implements RuntimeHintsRegistrar {
TypeReference.of(RepositoryFragmentsFactoryBean.class), //
TypeReference.of(RepositoryFragment.class), //
TypeReference.of(TransactionalRepositoryFactoryBeanSupport.class), //
TypeReference.of(Example.class), //
TypeReference.of(QueryByExampleExecutor.class), //
TypeReference.of(MappingContext.class), //
TypeReference.of(RepositoryMetadata.class), //
TypeReference.of(FluentQuery.class), //
TypeReference.of(FetchableFluentQuery.class), //
TypeReference.of(ReactiveFluentQuery.class) //
TypeReference.of(FetchableFluentQuery.class) //
), builder -> {
builder.withMembers(MemberCategory.INVOKE_PUBLIC_METHODS);
});
if (PROJECT_REACTOR_PRESENT) {
// repository infrastructure
hints.reflection().registerTypes(Arrays.asList( //
TypeReference.of(ReactiveFluentQuery.class), //
TypeReference.of(ReactiveQueryByExampleExecutor.class)), //
builder -> {
builder.withMembers(MemberCategory.INVOKE_PUBLIC_METHODS);
});
}
if (QuerydslUtils.QUERY_DSL_PRESENT) {
// repository infrastructure
hints.reflection().registerTypes(Arrays.asList( //
TypeReference.of(Predicate.class), //
TypeReference.of(QuerydslPredicateExecutor.class)), builder -> {
builder.withMembers(MemberCategory.INVOKE_PUBLIC_METHODS);
});
if (PROJECT_REACTOR_PRESENT) {
// repository infrastructure
hints.reflection().registerTypes(Arrays.asList( //
TypeReference.of(ReactiveQuerydslPredicateExecutor.class)), builder -> {
builder.withMembers(MemberCategory.INVOKE_PUBLIC_METHODS);
});
}
}
// named queries
hints.reflection().registerTypes(Arrays.asList( //
TypeReference.of(Properties.class), //