Подтвердить что ты не робот

Внедрить EJB в Eclipselink SessionCustomizer для предоставления имени схемы Oracle

В приложении Java EE 6, запущенном на GlassFish (3.1.2.2b5), предположим, что у вас есть ConfigurationService, который читает некоторые файлы свойств и соответствующим образом передает значения свойств:

@Local
public interface ConfigurationService { ... }

@Singleton  
public class ConfigurationServiceImpl implements ConfigurationService { ... }

Также существует Eclipselink SessionCustomizer, поскольку имя схемы одного из единиц персистентности (база данных Oracle) в приложении должно быть программно задано, то есть настраиваться из файлов свойств, упомянутых ранее. SessionCustomizer настроен в persistence.xml, а реализация содержит ссылку на ConfigurationService:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"...
    <persistence-unit name="myPU" transaction-type="JTA">
        <property name="eclipselink.session.customizer" value="MySessionCustomizer"/>
        ...

public class MySessionCustomizer implements SessionCustomizer {
    @EJB
    private ConfigurationService configurationService;
    @Override
    public void customize(Session session) {
        session.getLogin().setTableQualifier(configurationService.getSchemaName());
        ...

Можно ли вводить ConfigurationService таким образом, чтобы он был доступен, когда экземпляр SessionCustomizer был создан? Вышеупомянутое не выполняется, поскольку экземпляр ConfigurationService все еще имеет значение null, то есть инъекция еще не выполнена. Это наблюдение соответствует записям журнала сервера. Кажется, что механизм инъекции зависимостей неизменно начинается после того, как блоки устойчивости сохраняются и, следовательно, SessionCustomizer.. Я испортил различные аннотации (@Startup, @DependsOn(...),...), но безрезультатно. Является ли мое заключение правильным или есть другой способ, чтобы EJB создавал экземпляр и вводил раньше?

4b9b3361

Ответ 1

Поскольку создатель сеанса создается EclipseLink (а не вашим контейнером), контейнер не отвечает за инъекцию зависимостей.

Используйте поиск JNDI.