Значение семени в пользовательской области Weld CDI
Исходя из фона Guice, я знаю, что можно получить значение объекта из области видимости, используя.
scope.seed(Key.get(SomeObject.class), someObject);
Я полагаю, что это можно сделать, зарегистрировав Бин, который получает значение от AbstractBoundContext
, но примеры, просто отбирающие одно значение из пользовательской области, кажутся трудными для поиска. Как создать настраиваемую область, которая запускает значение, которое можно ввести в другом месте?
Изменить: в настоящее время я использую следующий обходной путь, который может быть введен в перехватчик, чтобы установить Configuration
при входе в область, а затем может быть введен через его поток локального поставщика. Я все еще ищу варианты, которые кажутся менее хакерскими / более интегрированы с контекстной системой scope / scope в Weld.
@Singleton
public class ConfigurationProducer {
private final InheritableThreadLocal<Configuration> threadLocalConfiguration =
new InheritableThreadLocal<>();
@Produces
@ActiveDataSet
public ConfigurationConfiguration() {
return threadLocalConfiguration.get()
}
public void setConfiguration(Configuration configuration) {
threadLocalConfiguration.set(configuration);
}
}
0 ответов
Ответ заключается в том, чтобы зарегистрировать пользовательский компонент в событии AfterBeanDiscovery, например, так:
event.addBean()
.createWith(ctx -> commandContext.getCurrentCommandExecution())
.addType(CommandExecution.class)
.addQualifier(Default.Literal.INSTANCE)
.scope(CommandScoped.class)
.beanClass(CommandExtension.class);
Существует довольно сложный пример, доступный по адресу https://github.com/weld/command-context-example