@RepositoryRestResource
interface ArticleRepository : JpaRepository<Article, Long>,
QuerydslPredicateExecutor<Article>,
QuerydslBinderCustomizer<QArticle> {
override fun customize(bindings: QuerydslBindings, root: QArticle) {
bindings.excluding(root.id, root.comments, root.modifiedAt, root.modifiedBy)
bindings.bind(root.content).first { path: StringExpression, value: String? -> path.containsIgnoreCase(value) }
bindings.bind(root.hashtag).first { path: StringExpression, value: String? -> path.containsIgnoreCase(value) }
bindings.bind(root.createdBy).first { path: StringExpression, value: String? -> path.containsIgnoreCase(value) }
bindings.bind(root.createdAt).first(DateTimeExpression<LocalDateTime>::eq)
}
}
querydsl에서 기본적으로 제공하는 기능들을 더 사용하려고 QuerydslBinderCustomizer를 사용하려고 하면 다음과 같은 에러가 발생하게 된다
No property 'customize' found for type 'Article'
흠 이에러가 무엇일까? kotlin에서만 발생하는 에러는 틀림없다. 알아본 결과
@JvmDefault
override fun customize(bindings: QuerydslBindings, root: QArticle) {
}
를 작성하면 된다고 한다.
하지만 컴파일러는 이를 빌드가 되지 않게 막는데 이유는 다음과 같다
Usage of '@JvmDefault' is only allowed with -Xjvm-default option
여기서 힌트를 얻을 수 있다.
바로 gradle에 저 옵션을 추가해주는 것이다.
기존 스프링부트 3 버젼이상의 kotlin프로젝트를 생성했을 때 기본은 다음과 같다
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "17"
}
}
여기에 "-Xjvm-default=all" 옵션을 달아주면 @JvmDefault를 달지 않고도 컴파일이 되고 querydsl에서도 제공하는 기능인 QuerydslBinderCustomizer를 사용할 수 있다.
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict", "-Xjvm-default=all")
jvmTarget = "17"
}
}
해결..! 👋🏼
querydsl에서 기본적으로 제공하는 기능들을 더 사용하려고
QuerydslBinderCustomizer를 사용하려고 하면 다음과 같은 에러가 발생하게 된다No property 'customize' found for type 'Article'흠 이에러가 무엇일까? kotlin에서만 발생하는 에러는 틀림없다. 알아본 결과
를 작성하면 된다고 한다.
하지만 컴파일러는 이를 빌드가 되지 않게 막는데 이유는 다음과 같다
Usage of '@JvmDefault' is only allowed with -Xjvm-default option여기서 힌트를 얻을 수 있다.
바로 gradle에 저 옵션을 추가해주는 것이다.
기존 스프링부트 3 버젼이상의 kotlin프로젝트를 생성했을 때 기본은 다음과 같다
여기에
"-Xjvm-default=all"옵션을 달아주면@JvmDefault를 달지 않고도 컴파일이 되고 querydsl에서도 제공하는 기능인QuerydslBinderCustomizer를 사용할 수 있다.해결..! 👋🏼