Skip to content

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

@saechimdaeki

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

해결..! 👋🏼

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions