Значение семени в пользовательской области 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

Другие вопросы по тегам