Начальное значение в пользовательской области Weld CDI

Исходя из фона Guice, я знаю, что можно посеять значение объекта из области, используя.

  scope.seed(Key.get(SomeObject.class), someObject);

Я предполагаю, что это можно было бы сделать, зарегистрировав Bean-компонент, который получает значение из AbstractBoundContext, но трудно найти примеры, просто задающие одно значение из Custom Scope. Как создать настраиваемую область, которая задает значение, которое можно внедрить в другом месте?

Редактировать: в настоящее время я использую следующий обходной путь, который можно внедрить в перехватчик, чтобы установить Configuration при входе в область действия, а затем можно внедрить через локальный поставщик потока. Я все еще ищу варианты, которые кажутся менее хакерскими / более интегрированными с системой контекста области/области в 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);
    }    

}

person Jan-Willem Gmelig Meyling    schedule 12.07.2016    source источник
comment
Функция seed в guice просто использует Map для хранения ваших объектов. В CDI вы пишете расширение и реализуете интерфейс Scope, если вам нужна пользовательская область. Все ваши засеянные объекты, вероятно, будут помещены в реализацию контекстного интерфейса на какой-либо карте.   -  person temaleva    schedule 13.07.2016
comment
Да, я узнал об аннотации области действия и расширениях. Однако мне интересно, как должен быть реализован javax.enterprise.context.spi.Context. И как перейти от Contextual к тому, что в Guice было бы Ключом.   -  person Jan-Willem Gmelig Meyling    schedule 13.07.2016
comment
Не могли бы вы дать более подробную информацию о пользовательской области, в которой вы нуждаетесь, и о том, чего вы пытаетесь достичь? Вам недостаточно встроенных прицелов?   -  person cassiomolin    schedule 18.07.2016
comment
Я пытаюсь использовать это для среды с несколькими арендаторами, где я создаю @TenantScoped, где @TenantScoped EntityManger привязан к провайдеру, который использует EntityManagerFactory, настроенный для этого арендатора. Поэтому при входе в область мне нужно иметь возможность передать ссылку на объект, которая позже может быть введена с помощью определенного ключа/квалификатора.   -  person Jan-Willem Gmelig Meyling    schedule 18.07.2016
comment
Похоже, вы используете JPA и вам нужны два разных поставщика менеджеров сущностей. Пожалуйста, ознакомьтесь с модулем Deltaspike Jpa - Multiple EntityManagers. deltaspike.apache.org/documentation/. Так что вам нужен предположительно квалифицированный продюсер, а не масштаб.   -  person temaleva    schedule 01.08.2016
comment
Нет, это может быть даже постоянная строка или POJO.   -  person Jan-Willem Gmelig Meyling    schedule 01.08.2016


Ответы (1)


Ответ заключается в регистрации пользовательского компонента с событием 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

person Jan-Willem Gmelig Meyling    schedule 13.02.2019