将 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 数据库)的架构名称需要以编程方式设置,即可以从前面提到的属性文件中进行配置。 SessionCustomizerpersistence.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 查找。