Skip to content

Native images: error processing @AttributeBinderType annotation '@org.hibernate.annotations.TenantId()' #37108

@seepine

Description

@seepine

Error Log

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.2)

2023-08-26T13:40:42.279Z  INFO 1 --- [           main] .e.h.o.HibernateOrmSpringbootApplication : Starting AOT-processed HibernateOrmSpringbootApplication using Java 17.0.7 with PID 1 (/work/application started by root in /work)
2023-08-26T13:40:42.279Z  INFO 1 --- [           main] .e.h.o.HibernateOrmSpringbootApplication : No active profile set, falling back to 1 default profile: "default"
2023-08-26T13:40:42.288Z  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-08-26T13:40:42.289Z  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-08-26T13:40:42.289Z  INFO 1 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.11]
2023-08-26T13:40:42.291Z  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-08-26T13:40:42.291Z  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 12 ms
2023-08-26T13:40:42.297Z  INFO 1 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2023-08-26T13:40:42.298Z  INFO 1 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.2.6.Final
2023-08-26T13:40:42.298Z  WARN 1 --- [           main] org.hibernate.orm.deprecation            : HHH90000029: The [hibernate.bytecode.use_reflection_optimizer] configuration is deprecated and will be removed. Set the value to [true] to get rid of this warning
2023-08-26T13:40:42.300Z  WARN 1 --- [           main] com.zaxxer.hikari.HikariConfig           : HikariPool-1 - idleTimeout is close to or more than maxLifetime, disabling it.
2023-08-26T13:40:42.300Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-08-26T13:40:42.308Z  INFO 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@6f2dd701
2023-08-26T13:40:42.308Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2023-08-26T13:40:42.311Z ERROR 1 --- [           main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: error processing @AttributeBinderType annotation '@org.hibernate.annotations.TenantId()'
2023-08-26T13:40:42.311Z  WARN 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': error processing @AttributeBinderType annotation '@org.hibernate.annotations.TenantId()'
2023-08-26T13:40:42.311Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-08-26T13:40:42.311Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2023-08-26T13:40:42.311Z  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-08-26T13:40:42.312Z ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': error processing @AttributeBinderType annotation '@org.hibernate.annotations.TenantId()'
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770) ~[application:6.0.11]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) ~[application:6.0.11]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[application:6.0.11]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[application:6.0.11]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[application:6.0.11]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[application:6.0.11]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[application:6.0.11]
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1155) ~[application:6.0.11]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) ~[application:6.0.11]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608) ~[application:6.0.11]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[application:3.1.2]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[application:3.1.2]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) ~[application:3.1.2]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[application:3.1.2]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[application:3.1.2]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[application:3.1.2]
        at com.example.hibernate.orm.HibernateOrmSpringbootApplication.main(HibernateOrmSpringbootApplication.java:10) ~[application:na]
Caused by: org.hibernate.AnnotationException: error processing @AttributeBinderType annotation '@org.hibernate.annotations.TenantId()'
        at org.hibernate.boot.model.internal.PropertyBinder.callAttributeBinders(PropertyBinder.java:281) ~[na:na]
        at org.hibernate.boot.model.internal.PropertyBinder.lambda$bind$964ff3a4$1(PropertyBinder.java:335) ~[na:na]
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1857) ~[application:6.2.6.Final]
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1814) ~[application:6.2.6.Final]
        at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:328) ~[na:na]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1380) ~[na:na]
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1451) ~[na:na]
        at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[na:na]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) ~[application:6.0.11]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[application:6.0.11]
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[application:6.0.11]
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) ~[application:6.0.11]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1817) ~[application:6.0.11]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1766) ~[application:6.0.11]
        ... 16 common frames omitted
Caused by: java.lang.InstantiationException: org.hibernate.binder.internal.TenantIdBinder
        at java.base@17.0.7/java.lang.Class.newInstance(DynamicHub.java:639) ~[application:na]
        at org.hibernate.boot.model.internal.PropertyBinder.callAttributeBinders(PropertyBinder.java:277) ~[na:na]
        ... 29 common frames omitted
Caused by: java.lang.NoSuchMethodException: org.hibernate.binder.internal.TenantIdBinder.<init>()
        at java.base@17.0.7/java.lang.Class.getConstructor0(DynamicHub.java:3585) ~[application:na]
        at java.base@17.0.7/java.lang.Class.newInstance(DynamicHub.java:626) ~[application:na]
        ... 30 common frames omitted

Steps

build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.2'
    id 'io.spring.dependency-management' version '1.1.2'
    id 'org.hibernate.orm' version '6.2.6.Final'
    id 'org.graalvm.buildtools.native' version '0.9.23'
}
java {
    sourceCompatibility = '17'
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'org.postgresql:postgresql'
}

application.yml

spring:
  jpa:
    properties:
      hibernate:
        multiTenancy: true
        tenant_identifier_resolver: com.example.hibernate.orm.config.TenantResolver

TenantResolver.java

public class TenantResolver implements CurrentTenantIdentifierResolver {
  @Override
  public String resolveCurrentTenantIdentifier() {
    return Optional.ofNullable(TenantUtil.getTenantId()).map(Serializable::toString).orElse(null);
  }
  @Override
  public boolean validateExistingCurrentSessions() {
    return true;
  }
  @Override
  public boolean isRoot(String tenantId) {
    return TenantUtil.ROOT.equals(tenantId);
  }
}

User.class

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SysUser {

  @Id
  @GeneratedValue(generator = "snowflakeId")
  @GenericGenerator(name = "snowflakeId", type = SnowflakeIdGenerator.class)
  String id;

  String  fullName;

  @TenantId
  String tenantId;
}

Dockerfile

FROM seepine/alpine-glibc
WORKDIR /work/
COPY ./build/native/nativeCompile/springboot-demo /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application"]

github actions yml

name: Build Images

on:
  push:
    tags:
      - v*

jobs:
  build-image:
    runs-on: ubuntu-latest
    env:
      DOCKER_REGISTRY: hub.example.com
      DOCKER_USERNAME: seepine
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup Graalvm
        uses: graalvm/setup-graalvm@v1
        with:
          java-version: '17'
          version: '22.3.2'
          components: 'native-image'
          cache: 'gradle'

      - name: Build Project
        run: |
          chmod a+x ./gradlew
          ./gradlew nativeCompile -x test --no-daemon

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker BuildX
        uses: docker/setup-buildx-action@v2

      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          registry: ${{ env.DOCKER_REGISTRY }}
          username: ${{ env.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Get Meta
        run: |
          echo REPO_VERSION=$(echo ${{ github.ref }} | awk -F"/" '{print $3}' | awk -F"v" '{print $2}') >> $GITHUB_ENV
          echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_ENV

      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          file: Dockerfile
          platforms: |
            linux/amd64
            linux/arm64
          push: true
          tags: |
            ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_USERNAME }}/${{ env.REPO_NAME }}:latest
            ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_USERNAME }}/${{ env.REPO_NAME }}:${{ env.REPO_VERSION }}

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: invalidAn issue that we don't feel is valid

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions