{"record":{"id":"5e487a5697e33c27","repo":"quarkusio/quarkus","slug":"method-tenantresolver-resolvetenantid-returned","errorCode":null,"errorMessage":"Method 'TenantResolver.resolveTenantId()' returned a null value. Unfortunately Hibernate ORM does not allow null for tenant identifiers. Please use a non-null value!","messagePattern":"Method 'TenantResolver\\.resolveTenantId\\(\\)' returned a null value\\. Unfortunately Hibernate ORM does not allow null for tenant identifiers\\. Please use a non-null value!","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/HibernateCurrentTenantIdentifierResolver.java","lineNumber":40,"sourceCode":"\n    private final String persistenceUnitName;\n\n    public HibernateCurrentTenantIdentifierResolver(String persistenceUnitName) {\n        this.persistenceUnitName = persistenceUnitName;\n    }\n\n    @Override\n    public String resolveCurrentTenantIdentifier() {\n\n        // Make sure that we're in a request\n        if (!Arc.container().requestContext().isActive()) {\n            return null;\n        }\n\n        TenantResolver resolver = tenantResolver(persistenceUnitName);\n        String tenantId = resolver.resolveTenantId();\n        if (tenantId == null) {\n            throw new IllegalStateException(\"Method 'TenantResolver.resolveTenantId()' returned a null value. \"\n                    + \"Unfortunately Hibernate ORM does not allow null for tenant identifiers. \"\n                    + \"Please use a non-null value!\");\n        }\n        LOG.debugv(\"resolveCurrentTenantIdentifier(): {0}\", tenantId);\n        return tenantId;\n\n    }\n\n    @Override\n    public boolean validateExistingCurrentSessions() {\n        return false;\n    }\n\n    @Override\n    public boolean isRoot(String tenantId) {\n        // Make sure that we're in a request\n        if (!Arc.container().requestContext().isActive()) {\n            return false;","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/HibernateCurrentTenantIdentifierResolver.java#L22-L58","documentation":"Hibernate ORM forbids null tenant identifiers. Quarkus' HibernateCurrentTenantIdentifierResolver calls the application's TenantResolver.resolveTenantId() and throws IllegalStateException when it returns null, telling you to return a non-null value.","triggerScenarios":"A registered TenantResolver whose resolveTenantId() returns null at runtime — e.g. no tenant context in the request (missing header/path segment), unauthenticated request where the resolver derives the tenant from the security identity, or a test/mock resolver returning null.","commonSituations":"Resolver extracting tenant from an HTTP header that isn't present; SecurityIdentity-dependent resolver hit on the login/unauthenticated endpoint; forgetting a default/fallback tenant id for non-tenant endpoints.","solutions":["Return a non-null default tenant id from resolveTenantId() when no tenant context is available","Reject the request earlier (e.g. in a filter/interceptor) when the tenant identifier is missing, before Hibernate resolves it","Make the resolver fail fast with your own descriptive exception (e.g. 400 Bad Request) instead of returning null","Test with an explicit tenant header/path so the resolver never receives null input"],"exampleFix":"// before\npublic String resolveTenantId() {\n    return headers.getHeaderString(\"X-Tenant\"); // may be null -> throws\n}\n// after\npublic String resolveTenantId() {\n    String t = headers.getHeaderString(\"X-Tenant\");\n    return t != null ? t : \"default\";\n}","handlingStrategy":"validation","validationCode":"String tenantId = resolver.resolveTenantId();\nif (tenantId == null) {\n    tenantId = \"default\"; // or reject request before Hibernate resolves tenants\n}","typeGuard":"Optional<String> safeTenant(TenantResolver r) {\n    return Optional.ofNullable(r.resolveTenantId());\n}","tryCatchPattern":"try {\n    doJpaWork();\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"returned a null value\")) {\n        Log.error(\"TenantResolver returned null; provide a default or reject the request\");\n        throw new BadRequestException(\"Missing tenant context\");\n    }\n    throw e;\n}","preventionTips":["Never return null from resolveTenantId(); fall back to a default tenant","Reject requests lacking tenant context in a filter before Hibernate runs","Cover unauthenticated endpoints in tests since they bypass tenant extraction"],"tags":["multitenancy","hibernate-orm","null"],"backgroundTag":"null-tenant-identifier","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}