Вызов Singleton EJB во время инициализации статической переменной - PullRequest
0 голосов
/ 13 октября 2018

У меня есть потокобезопасный тяжелый ресурс, и я хотел бы инициализировать его как переменную статического класса.Во время инициализации этого объекта мне нужно прочитать некоторые параметры «соединения» из внешнего файла свойств.

Для чтения параметров инициализации я хотел бы использовать мой exicting Configuration Singleton EJB, но кажется, что мой введенный configurationbean имеет значение null во время развертывания (когда контейнер EE инициализирует мою статическую переменную).

Это мой конфигурационный EJB:

@Startup
@Singleton
@LocalBean
public class Configuration {

    @Lock(LockType.READ)
    public String getValue(String key) {
        return ...;
    }
}

Это путькак я хотел бы инициализировать мой HeavyObject:

@Stateless
public class SenderBean {

    private static HeavyObject something;

    @Inject
    private Configuration configuration;

    public SendNotificationBean()  {
        String host = configuration.getValue("....");
        String port= configuration.getValue("....");

        something = new HeavyObject(host, port);
    }
}

Но configuration имеет значение null:

Caused By: java.lang.NullPointerException
        at com.aaa.bbb.business.SenderBean.configureProxy(SenderBean.java:187)

Может быть, мне нужно изменить порядок, как контейнер инициализирует EJB-ы

1 Ответ

0 голосов
/ 13 октября 2018

Это не будет работать, так как контейнер вызывает конструктор по умолчанию, прежде чем что-то внедрить.Для этого есть аннотация @PostConstruct.

Чтобы обойти это, я бы также сделал HeavyObject синглтон-бином и вставил в него Configuration.Что-то вроде:

@Singleton
public class HeavyObject {

    @Inject
    private Configuration conf;

    @PostConstruct
    private void configure() {
        // make something with the conf
    }

}

и введите его:

@Stateless
public class SenderBean {

    @Inject
    private HeavyObject ho;
    ...
}

Конечно, это всего лишь один из способов сделать это, но я бы порекомендовал избегать статических вещей в бобах и тщательно обдумать, чтов ответственности бобов.Вот почему я поместил логику конфигурации @PostConstruct в HeavyObject singleton вместо того, чтобы запускать ее на SenderBean.

Ничто не мешает вам вводить Configuration в SenderBean также, если естьиспользуйте для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...