将 EJB 注入 Eclipselink SessionCustomizer 以提供 Oracle 模式名称
Inject EJB into Eclipselink SessionCustomizer to provide Oracle schema name
在 GlassFish (3.1.2.2b5) 上的 Java EE 6 应用程序 运行 中,假设您有一个 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
实例仍然为空,即注入尚未发生。此观察对应于服务器的日志条目。 似乎依赖注入机制总是在持久性单元之后启动 - 因此 SessionCustomizer
- 被实例化。 我搞砸了各种注释(@Startup
, @DependsOn(...)
, ...) 但无济于事。我的结论是正确的还是有其他方法可以更快地实例化和注入 EJB?
由于会话定制器是由 EclipseLink(而不是由您的容器)创建的,因此容器不负责注入依赖项。
使用 JNDI 查找。
在 GlassFish (3.1.2.2b5) 上的 Java EE 6 应用程序 运行 中,假设您有一个 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
实例仍然为空,即注入尚未发生。此观察对应于服务器的日志条目。 似乎依赖注入机制总是在持久性单元之后启动 - 因此 SessionCustomizer
- 被实例化。 我搞砸了各种注释(@Startup
, @DependsOn(...)
, ...) 但无济于事。我的结论是正确的还是有其他方法可以更快地实例化和注入 EJB?
由于会话定制器是由 EclipseLink(而不是由您的容器)创建的,因此容器不负责注入依赖项。
使用 JNDI 查找。