В приложении 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 создавал экземпляр и вводил раньше?