Skip to content

AOT Repos treating booleans as integers #2186

@RobMaskell

Description

@RobMaskell

Converting my app to Spring Boot 4, it runs as a native app and uses Spring Data JDBC so it's using the new aot repositories. I get some weird behaviour on a particular boolean field, it's boolean in the database, boolean in the object but something wants to play the Integer game.

I've created a minimal sample app that shows the issue. App will run fine in the IDE but a ./gradlew nativeRun will/should generate a stack trace like this one below. I run against postgres so you'll need a db called aottest with a user of the same name.

This seemed like a sensible project to report to but let me know if I've got the wrong one.

aotrepodemo.zip

java.lang.IllegalArgumentException: Can not set boolean field com.example.demo.SheetsUser.enabled to java.lang.Integer
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.fieldaccessor.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:266)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.fieldaccessor.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:270)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.fieldaccessor.UnsafeBooleanFieldAccessorImpl.set(UnsafeBooleanFieldAccessorImpl.java:95)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.methodhandles.Util_java_lang_invoke_MethodHandle.invokeInternal(Target_java_lang_invoke_MethodHandle.java:207)
        at java.base@25.0.1/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:102)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.methodhandles.MethodHandleIntrinsicImpl.execute(MethodHandleIntrinsicImpl.java:179)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.methodhandles.Util_java_lang_invoke_MethodHandle.invokeInternal(Target_java_lang_invoke_MethodHandle.java:186)
        at java.base@25.0.1/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:102)
        at java.base@25.0.1/java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:96)
        at java.base@25.0.1/java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:914)
        at java.base@25.0.1/java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:891)
        at java.base@25.0.1/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:109)
        at java.base@25.0.1/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:0)
        at java.base@25.0.1/java.lang.invoke.LambdaForm$MH/sa9cc65ae.invoke_MT(LambdaForm$MH)
        at com.example.demo.SheetsUser__Accessor_x7mayh.setProperty(Unknown Source)
        at org.springframework.data.mapping.model.InstantiationAwarePropertyAccessor.setProperty(InstantiationAwarePropertyAccessor.java:81)
        at org.springframework.data.mapping.model.ConvertingPropertyAccessor.setProperty(ConvertingPropertyAccessor.java:62)
        at org.springframework.data.relational.core.conversion.MappingRelationalConverter.readProperties(MappingRelationalConverter.java:587)
        at org.springframework.data.relational.core.conversion.MappingRelationalConverter.populateProperties(MappingRelationalConverter.java:551)
        at org.springframework.data.relational.core.conversion.MappingRelationalConverter.read(MappingRelationalConverter.java:487)
        at org.springframework.data.relational.core.conversion.MappingRelationalConverter.readAggregate(MappingRelationalConverter.java:376)
        at org.springframework.data.relational.core.conversion.MappingRelationalConverter.readAggregate(MappingRelationalConverter.java:334)
        at org.springframework.data.jdbc.core.convert.MappingJdbcConverter.readAndResolve(MappingJdbcConverter.java:352)
        at org.springframework.data.jdbc.core.convert.EntityRowMapper.mapRow(EntityRowMapper.java:65)
        at org.springframework.data.jdbc.core.JdbcAggregateTemplate$LifecycleEntityRowMapper.mapRow(JdbcAggregateTemplate.java:778)
        at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:110)
        at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:62)
        at org.springframework.jdbc.core.JdbcTemplate.lambda$query$0(JdbcTemplate.java:738)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:669)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:731)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:751)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:803)
        at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:224)
        at org.springframework.data.jdbc.repository.aot.AotRepositoryFragmentSupport.queryForObject(AotRepositoryFragmentSupport.java:141)
        at com.example.demo.SheetsUserRepositoryImpl__AotRepository.lambda$findOneByUsername$0(SheetsUserRepositoryImpl__AotRepository.java:60)
        at org.springframework.data.jdbc.repository.query.StatementFactory$SelectionBuilder.executeWith(StatementFactory.java:189)
        at com.example.demo.SheetsUserRepositoryImpl__AotRepository.findOneByUsername(SheetsUserRepositoryImpl__AotRepository.java:60)
        at java.base@25.0.1/java.lang.reflect.Method.invoke(Method.java:565)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)
        at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:278)
        at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:169)
        at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158)
        at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:545)
        at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:290)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:708)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:171)
        at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:146)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:370)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:135)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:222)
        at jdk.proxy4/jdk.proxy4.$Proxy/s510da763.findOneByUsername(Unknown Source)
        at com.example.demo.DemoAppRunner.run(DemoAppRunner.java:21)
        at org.springframework.boot.SpringApplication.lambda$callRunner$1(SpringApplication.java:801)
        at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:82)
        at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60)
        at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:86)
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:809)
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800)
        at org.springframework.boot.SpringApplication.lambda$callRunners$0(SpringApplication.java:785)
        at java.base@25.0.1/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:186)
        at java.base@25.0.1/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
        at java.base@25.0.1/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:571)
        at java.base@25.0.1/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
        at java.base@25.0.1/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:153)
        at java.base@25.0.1/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:176)
        at java.base@25.0.1/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)
        at java.base@25.0.1/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:632)
        at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:785)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:328)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1374)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
        at com.example.demo.DemoApplication.main(DemoApplication.java:10)
        at java.base@25.0.1/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)

Metadata

Metadata

Assignees

No one assigned

    Labels

    for: external-projectFor an external project and not something we can fix

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions