【问题标题】:How to use ReactiveQuerydslPredicateExecutor with spring webflux如何将 ReactiveQuerydslPredicateExecutor 与 spring webflux 一起使用
【发布时间】:2020-12-28 23:29:34
【问题描述】:

我正在尝试使用 ReactiveQuerydslPredicateExecutor 和 spring webflux,使用 Mysql 数据库和 r2dbc。扩展 ReactiveSortingRepository 的存储库完美运行。

但是,如果我也扩展 ReactiveQuerydslPredicateExecutor,那么它将无法编译。我正在使用EnableR2dbcRepositories 启用 r2dbc。回到反应包的前一天,必须将“EnableJPARepositories”的基本包更改为相关的“Q”包。但是我在这里找不到任何东西,它说没有“findAll 方法”。

代码:

@Table("user")
@AllArgsConstructor
@NoArgsConstructor
@Data
@QueryEntity
public class User {

    @Id
    Long id;

    String name;

    String email;
}
@Repository
public interface UserRepository extends ReactiveSortingRepository<User, Long>, ReactiveQuerydslPredicateExecutor<User> {
}

@Configuration
@EnableR2dbcRepositories(repositoryBaseClass = ReactiveCrudRepository.class)
public class AppConfig {
}

错误:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property findAll found for type User!
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:94) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:382) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:358) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.data.mapping.PropertyPath.lambda$from$0(PropertyPath.java:311) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:324) ~[na:1.8.0_211]
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:293) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:276) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:82) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.data.repository.query.parser.PartTree$OrPart.lambda$new$0(PartTree.java:251) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_211]
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) ~[na:1.8.0_211]
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:1.8.0_211]
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_211]
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_211]
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_211]
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_211]
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_211]
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:252) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.data.repository.query.parser.PartTree$Predicate.lambda$new$0(PartTree.java:381) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_211]
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) ~[na:1.8.0_211]
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:1.8.0_211]
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_211]
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_211]
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_211]
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_211]
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_211]
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:382) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:94) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
    at org.springframework.data.r2dbc.repository.query.PartTreeR2dbcQuery.<init>(PartTreeR2dbcQuery.java:66) ~[spring-data-r2dbc-1.1.6.RELEASE.jar:1.1.6.RELEASE]
    ... 55 common frames omitted

*** 编辑:***

我的数据库连接(在 application.properties 中):

spring.r2dbc.url=r2dbc:mysql://127.0.0.1:3306/testdb
spring.r2dbc.username=root
spring.r2dbc.password=

我的 pom.xml:(我使用的是最新版本的所有内容,都有排除项,因为同一个包的版本冲突。旧的被排除在外。)

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <version>2.3.7.RELEASE</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-r2dbc</artifactId>
            <version>2.3.7.RELEASE</version>
            <exclusions>
                <exclusion>
                    <artifactId>reactor-core</artifactId>
                    <groupId>io.projectreactor</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.jasync-sql</groupId>
            <artifactId>jasync-r2dbc-mysql</artifactId>
            <version>1.1.4</version>
            <exclusions>
                <exclusion>
                    <artifactId>r2dbc-spi</artifactId>
                    <groupId>io.r2dbc</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>reactor-core</artifactId>
                    <groupId>io.projectreactor</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>kotlin-stdlib</artifactId>
                    <groupId>org.jetbrains.kotlin</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>kotlin-stdlib-common</artifactId>
                    <groupId>org.jetbrains.kotlin</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>netty-handler</artifactId>
                    <groupId>io.netty</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>netty-transport</artifactId>
                    <groupId>io.netty</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-sql-spring</artifactId>
            <version>4.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-reflect</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>

【问题讨论】:

  • 我们需要更多代码,你如何设置你的数据库连接,以及你的 pom.xml
  • 两者都添加了。这是我的完整 pom xml,除了样板 artifactId、groupId。
  • 你能激发 pom 中的所有排除吗?
  • 激励是什么意思?解释?排除的所有内容都包含在具有更高版本号的另一个包中。
  • UserRepository 中,@Repository 注释不会做任何事情,因为没有单例可以放入 spring 上下文中。

标签: java spring reactive-programming spring-webflux querydsl


【解决方案1】:

没有像SimpleR2dbcRepository这样的仓库实现ReactiveQuerydslPredicateExecutor

在JPA中,有QuerydslJpaPredicateExecutor实现QuerydslPredicateExecutor

因此,如果您的存储库实现了QuerydslPredicateExecutor,Spring Data JPA 可以创建一个代理来为您的存储库使用SimpleJpaRepositoryQuerydslJpaPredicateExecutor 方法。

Querydsl 还不支持 r2dbc。

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 2020-04-10
    • 1970-01-01
    • 2019-09-27
    • 2021-09-11
    • 1970-01-01
    • 2021-09-05
    • 2019-03-26
    • 2021-10-21
    相关资源
    最近更新 更多