我一直在使用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。 trip.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,从而解决了该问题。
此问题的解决方案是在custom方法上使用@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)
}
}