将EJB注入Eclipselink SessionCustomizer以提供Oracle模式名称

时间:2015-05-20 15:37:02

标签: java oracle eclipselink java-ee-6 ejb-3.1

在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,{ {1}},...)但无济于事。我的结论是正确的还是有另一种方法让EJB更早实例化并注入?

1 个答案:

答案 0 :(得分:3)

由于会话自定义程序是由EclipseLink(而不是您的容器)创建的,因此容器不负责注入依赖项。

使用JNDI查找。