自定义 InjectableContext 在 Quarkus 中同一 bean 中的两个注入点之间不能不同

问题描述 投票:0回答:0

我尝试实现一个

@TenantScope
可用于有状态 bean 而不是使用嵌套映射。为此,我正在实施
io.quarkus.arc.InjectableContext
.

到目前为止,我一直在使用它,除非我有两个相同类型的注入点。我对这两个

get(...)
方法的实现如下所示::

@Override
public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext) {
    String tenantId = getTenantIdFromContex();
    Map<String, ContextInstanceHandle<?>> tenantMap = contextualMap.computeIfAbsent(contextual, c -> new HashMap<>());
    @SuppressWarnings("unchecked")
    ContextInstanceHandle<T> contextInstanceHandle =
            (ContextInstanceHandle<T>) tenantMap.computeIfAbsent(tenantId, t -> {
                if (creationalContext == null) {
                    return null;
                }
                T createdInstance = contextual.create(creationalContext);
                return new ContextInstanceHandleImpl<T>(
                        (InjectableBean<T>) contextual, createdInstance, creationalContext);
            });
    return contextInstanceHandle.get();
}

@SuppressWarnings("unchecked")
@Override
public <T> T get(Contextual<T> contextual) {
    String tenantId = getTenantIdFromContex();
    if(!contextualMap.containsKey(contextual) || !contextualMap.get(contextual).containsKey(tenantId)){
        return null;
    }
    return ((ContextInstanceHandle<T>) contextualMap.get(contextual).get(tenantId)).get();
}

假设这个bean

@TenantScoped
class MyTenantScopedQueue(){...}

当我在 bean 中有一个

@TenantScoped
类型的单个注入点时,我的自定义上下文的行为符合预期。根据我的上下文的 tenantId,我得到了特定的实例。一旦我有两个注入点,我就会遇到问题:

class MyBean() {

@Inject
MyTenantScopedQueue queue;
@Inject
MyTenantScopedQueue queueForOtherStuff;

...
}

似乎

Contextual<T>
没有足够的信息来区分这两个注入点,导致相同的实例被注入两次。我怎样才能实现我的
InjectableContext
以便我为每个注入点获得不同的实例?

java dependency-injection cdi quarkus custom-scope
© www.soinside.com 2019 - 2024. All rights reserved.