spring - 将 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)
}
}
解决方案
我遇到了同样的问题:使用 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 版本的接口默认方法。
那解决了这个问题!
推荐阅读
- c# - 有多个枚举作为参数
- javascript - 使用 webpack 时客户端模块无法访问依赖模块
- pytorch - 使用“gloo”后端时,pytorch 分布式训练失败
- flutter - 如何在数据更改时从实时数据库构建列表并在 Flutter 中更新 ListView?
- java - EditText 与其在 Android Studio 中的 Id 的关系?
- python - 根据熊猫中的条件填充数据框列
- javascript - 运行 do while 循环会导致致命错误
- c++ - 是否可以在`std::forward`中省略模板参数?
- reactjs - 尽管状态值已重置,但下拉重置在 UI 中不可见 ReactJs
- html - 如何在不转换为'&'的情况下在html中编写'&'?