首页 > 解决方案 > 将 QuerydslBinderCustomizer 与 Kotlin Spring Data 一起使用时出现 IllegalArgumentException

问题描述

我一直在使用 Spring Data 的 querydsl 支持来对我的域实体进行过滤。但是,当我尝试在我的存储库中覆盖 QuerydslBinderCustomizer 的自定义方法时,我得到一个 IllegalArgumentException,如下所示:

调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException: 无法为方法 public abstract void com.my.project.repository.TripRepository.customize(org.springframework.data.querydsl.binding.QuerydslBindings,com.my.project.domain 创建查询。旅行.QTrip)!没有为类型 Trip 找到自定义属性!

我的存储库定义如下:

@Repository
interface TripRepository : PagingAndSortingRepository<Trip, Long>, QuerydslPredicateExecutor<Trip>, QuerydslBinderCustomizer<QTrip> {
    fun findByState(tripState: TripState): List<Trip>

    override fun customize(bindings: QuerydslBindings, root: QTrip) {
        bindings.excluding(root.anonymousToken)
    }
}

看起来 PagingAndSortingRepository 正在我的 Trip 实体上搜索自定义字段,尽管它是来自另一个接口的方法覆盖。我尝试向自定义方法添加一个空的@Query 注释,希望它会被忽略而无济于事。

这个问题有什么解决方法吗?

更新

我还没有设法让这个在 Kotlin 中工作。我最终(不情愿地)将我的存储库类转换为 Java,从而解决了这个问题。

更新

此问题的解决方案是在自定义方法上使用@JvmDefault 注解。

@Repository
interface TripRepository : PagingAndSortingRepository<Trip, Long>, QuerydslPredicateExecutor<Trip>, QuerydslBinderCustomizer<QTrip> {
    fun findByState(tripState: TripState): List<Trip>

    @JvmDefault
    override fun customize(bindings: QuerydslBindings, root: QTrip) {
        bindings.excluding(root.anonymousToken)
    }
}

标签: springkotlinspring-data-jpaspring-dataquerydsl

解决方案


我遇到了同样的问题:使用 kotlin、spring-data-rest 和 querydslproduced

org.springframework.data.mapping.PropertyReferenceException: No property customize found for type <MyEntity>

为了克服这个问题,我指定

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        freeCompilerArgs = ["-Xjvm-default=all"]
    }
}

在我build.gradle让 kotlin 使用 JVM 版本的接口默认方法。

那解决了这个问题!


推荐阅读