Wie kann ich eine Request-Scope-Bean in einer Komponente verwenden und auf einen Standardwert außerhalb des Request-Scop
Posted: 23 Jan 2025, 07:43
Ich habe zwei verschiedene Klassen: TenantContext, bei dem es sich um den Anforderungsbereich handelt, und TenantIdentfierResolver, bei dem es sich um eine Komponente handelt. Während der Anforderungsbereiche sollte TenantIdentifierResolver den Namen des aktuellen Mandanten aus TenantContext abrufen. Außerhalb der Anforderungsbereiche sollte er einfach den Standardwert zurückgeben. (Der Mandantenkontext wird von der Controller-Funktion in Endpunkten festgelegt, die ihn erfordern). So sieht das aus.
Aber dies gibt immer Ausnahmen zurück wie folgt:
Ich habe es bereits versucht
Sowie ein ObjectProvider und eine @Optional-Annotation, aber alle führen zu einer ähnlichen Ausnahme. Wie kann ich den TenantContext also nur dann aufrufen, wenn er tatsächlich verfügbar ist? Es scheint, dass ObjectProviders getIfAvailable die perfekte Lösung wäre (null zurückgeben, wenn das Objekt nicht verfügbar ist), aber es gibt einfach eine Ausnahme aus.
Code: Select all
@Component
@RequestScope
public class TenantContext {
@Getter @Setter
private String currentTenant=null;
}
@Component
@RequiredArgsConstructor
public class TenantIdentifierResolver implements CurrentTenantIdentifierResolver, HibernatePropertiesCustomizer {
private final TenantContext tenantContext;
private static String defaultValue="default";
@Override
public String resolveCurrentTenantIdentifier() {
return tenantContext==null?defaultValue:tenantContext.getCurrentTenant();
}
@Override
public void customize(Map hibernateProperties) {
hibernateProperties.put(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, this);
}
@Override
public boolean validateExistingCurrentSessions() {
return false;
}
}
Code: Select all
Error creating bean with name 'scopedTarget.tenantContext': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton
Code: Select all
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyModel = ScopedProxyMode.TARGET_CLASS)