在运行于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
实例仍然为null,即注入尚未发生,因此上述操作失败。此观察结果对应于服务器的日志条目。似乎依赖注入机制总是在持久性单元(因此,SessionCustomizer
它们)被无效化之后启动的。我搞砸周围的各种注释(@Startup
,@DependsOn(...)
,...),但无济于事。我的结论是正确的,还是还有另一种方法可以更快地实例化和注入EJB?
由于会话定制程序是由EclipseLink创建的(而不是由您的容器创建的),因此容器不负责注入依赖项。
使用JNDI查找。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句