Skip to content

Kotlin에서 QuerydslBinderCustomizer를 사용할 때 에러 해결 feat. -Xjvm-default option #4

Description

@saechimdaeki
@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"
    }
}

해결..! 👋🏼

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions