spring-attic / spring-native

Spring Native is now superseded by Spring Boot 3 official native support
https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html
Apache License 2.0
2.74k stars 355 forks source link

JPA : antlr error with @ElementCollection @OrderBy #1473

Closed AfshinHonari closed 2 years ago

AfshinHonari commented 2 years ago

I have an issue when running native spring boot app on Gradle with nativeRun or bootBuildImage and then run on docker; when the application is launching after checking JPA the following exception accrue and application is failed to launch CharScanner; panic: ClassNotFoundException: antlr.CommonToken

pluings I used: plugins { id 'org.springframework.boot' version '2.6.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'org.springframework.experimental.aot' version '0.11.2' id 'org.hibernate.orm' }

build image config: bootBuildImage { builder = 'paketobuildpacks/builder:tiny' environment = ['BP_NATIVE_IMAGE': 'true'] imageName='ahs441/vimage' }

hibernate config: hibernate { enhance { enableLazyInitialization = true enableDirtyTracking = true enableAssociationManagement = true enableExtendedEnhancement = false } }

bclozel commented 2 years ago

We're going to need more information to understand what's going on here. A complete stacktrace would help, but I suspect a minimal, sample application would be more helpful. Could you share a minimal repro app for this?

AfshinHonari commented 2 years ago

The stacktrace is empty with only CharScanner; panic: ClassNotFoundException: antlr.CommonToken exception; The dependencies are: implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.postgresql:postgresql' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test'

implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2',
        'io.jsonwebtoken:jjwt-jackson:0.11.2' 

implementation 'org.bouncycastle:bcprov-jdk15to18:1.70'

implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'

implementation platform('com.amazonaws:aws-java-sdk-bom:1.12.131')
implementation 'com.amazonaws:aws-java-sdk-s3'

implementation "com.github.kokorin.jaffree:jaffree:2021.12.30"
implementation 'net.jthink:jaudiotagger:3.0.1'

annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa'
annotationProcessor 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation('com.querydsl:querydsl-jpa:5.0.0')

implementation 'org.ocpsoft.prettytime:prettytime:5.0.2.Final'

implementation 'com.github.kavenegar:kavenegar-java:v2.0.1'

implementation 'org.springdoc:springdoc-openapi-ui:1.6.5'
implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.6.5'
implementation 'org.springdoc:springdoc-openapi-security:1.6.5'
implementation 'org.springdoc:springdoc-openapi-native:1.6.5'

implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr353'
implementation 'javax.json:javax.json-api'
implementation 'org.apache.johnzon:johnzon-core'
implementation 'com.google.firebase:firebase-admin:8.1.0'
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.41'

and the error is:

Screen Shot 2022-01-28 at 15 07 58

OS is MacOS 12.1 Docker version 20.10.8, build 3967b7d GraalVM : openjdk 17.0.2 2022-01-18 - GraalVM CE 22.0.0.2

bclozel commented 2 years ago

There is no way for us to reproduce the problem with the information you've provided.

AfshinHonari commented 2 years ago

Finally, I found this issue occurs when I use @OrderBy annotation in hibernate entity

sdeleuze commented 2 years ago

I can reproduce by adding @ElementCollection @OrderBy private List<String> phoneNumbers; to data-jpa sample here.

sdeleuze commented 2 years ago

I have been able to get past this error by adding:

@TypeHint(types = {
        antlr.CommonToken.class,
        org.hibernate.persister.collection.BasicCollectionPersister.class
})

But I get the following error which lead me to think Antlr require more reflection configuration:

Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.collection.BasicCollectionPersister
    at org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:178) ~[na:na]
    at org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:140) ~[na:na]
    at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:225) ~[na:na]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:303) ~[na:na]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:468) ~[na:na]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259) ~[na:na]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[na:na]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[data-jpa:5.3.15]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[data-jpa:5.3.15]
    ... 20 common frames omitted
Caused by: org.hibernate.HibernateException: Unable to parse order-by fragment
    at org.hibernate.sql.ordering.antlr.OrderByFragmentTranslator.translate(OrderByFragmentTranslator.java:55) ~[na:na]
    at org.hibernate.sql.Template.translateOrderBy(Template.java:724) ~[na:na]
    at org.hibernate.persister.collection.AbstractCollectionPersister.<init>(AbstractCollectionPersister.java:575) ~[data-jpa:5.4.33]
    at org.hibernate.persister.collection.BasicCollectionPersister.<init>(BasicCollectionPersister.java:59) ~[data-jpa:5.4.33]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na]
    at org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:152) ~[na:na]
    ... 28 common frames omitted
Caused by: java.lang.NullPointerException: null
    at org.hibernate.sql.ordering.antlr.OrderByFragmentParser.isFunctionName(OrderByFragmentParser.java:77) ~[na:na]
    at org.hibernate.sql.ordering.antlr.GeneratedOrderByFragmentParser.expression(GeneratedOrderByFragmentParser.java:685) ~[na:na]
    at org.hibernate.sql.ordering.antlr.GeneratedOrderByFragmentParser.sortKey(GeneratedOrderByFragmentParser.java:359) ~[na:na]
    at org.hibernate.sql.ordering.antlr.GeneratedOrderByFragmentParser.sortSpecification(GeneratedOrderByFragmentParser.java:249) ~[na:na]
    at org.hibernate.sql.ordering.antlr.GeneratedOrderByFragmentParser.orderByFragment(GeneratedOrderByFragmentParser.java:193) ~[na:na]
    at org.hibernate.sql.ordering.antlr.OrderByFragmentTranslator.translate(OrderByFragmentTranslator.java:49) ~[na:na]

@christophstrobl @schauder Could you please take it from there?