TenantIdentifier auf Controller-Ebene ändern
Posted: 03 Jan 2025, 17:22
Wir implementieren Multitenancy in unserem Produkt und verwenden ein Datenbank-pro-Mandant-Entwurfsmuster. Wir folgten dem hier vorgeschlagenen Mandanten-pro-Anfrage-Muster, Spring Multitenant und Arbeitsbeispiel
Der obige Ansatz funktioniert gut, wenn wir bereits wissen, in welcher Datenbank/welchem Schema wir suchen möchten.
Wir Wir haben einen Anwendungsfall, bei dem wir im Standardschema suchen müssen und, wenn es nicht gefunden wird, in einem anderen Schema suchen müssen. Sobald die Anfrage jedoch die Controller-Ebene erreicht, können wir den Kontext nicht mehr ändern und es bleibt nur das Standardschema erhalten. Ich habe es mit dem folgenden Code versucht -
Bitte teilen Sie uns mit, ob wir dies zum Laufen bringen können, ohne für alle Schemas manuelle EntityManager/Sessionfactories hinzuzufügen
Der obige Ansatz funktioniert gut, wenn wir bereits wissen, in welcher Datenbank/welchem Schema wir suchen möchten.
Wir Wir haben einen Anwendungsfall, bei dem wir im Standardschema suchen müssen und, wenn es nicht gefunden wird, in einem anderen Schema suchen müssen. Sobald die Anfrage jedoch die Controller-Ebene erreicht, können wir den Kontext nicht mehr ändern und es bleibt nur das Standardschema erhalten. Ich habe es mit dem folgenden Code versucht -
Code: Select all
public class PersonController {
@Qualifier("otherSchemaDataSource")
private final DataSource otherSchemaDataSource;
public PersonDto getPerson(@PathVariable String personId) {
try {
return personService.getById(personId); //search with default schema
} catch (Exception e) {
// search in other schema if not found in default schema
TenantContext.setTenantInfo("other_schema");
Object oo = "other_schema";
sessionFactory.withStatelessOptions().tenantIdentifier(oo);
tenantIdentifierResolver.resolveCurrentTenantIdentifier();
multiTenantConnectionConfig.setDataSource(otherSchemaDataSource);
multiTenantConnectionConfig.getConnection("other_schema");
multiTenantConnectionConfig.setDataSource(ecmArchiveDataSourc);
return personService.getById(personId);
}
}
}