我在部署我的Java EE应用程序时遇到了一些问题,并且可能会使用一些建议。
我有3个组件来部署:Java EE部署问题
- 集成层(数据):POJO和CDI豆类 - JAR文件
- 应用层(BL):的EJB,CDI豆类和POJO - JAR文件
- 演示层:Servlets和这样的 - WAR文件
理想情况下,我希望能够在同一个Java EE服务器同时部署的集成和应用层的JAR,而是作为独立的JAR文件(因为我可能要改变硬件配置稍后和将它们分成两台不同的机器上的两台不同的服务器)。
问题是,我无法从集成层JAR中将CDI注入从应用程序层JAR中取得工作。服务器说(并且可能是这样),解决注入是不可能的。
到目前为止,我想出了这些可能的解决方案:
- 包的两个JAR成一个单一的EAR文件(在WAR也许奉送......),并部署
- 使用JNDI在不同的层之间(可能创建一个CDI生产者根据JNDI名称或类似的东西进行通用注入)
- 在集成层中,使对象注入应用层(DAO)EJB而不是CDI bean
我不喜欢这些解决方案(特别是最后一个),因为它们限制了我未来的部署选项。第二种解决方案并不限制我,但在某些时候(当我累积大量代码时)可能会变得乏味。
最后,我的问题是:
是否有一个选项,我没有找到呢,这将让我的两个JAR与CDI注射工作在同一台服务器上部署?如果在某些时候我可以将JAR分离到不同的服务器中,那么可能还会有效。
我在TomEE服务器上部署,我认为它不支持这两个选项中的任何一个。我也希望保持独立于服务器选择的东西,以防以后更改服务器。我意识到EJB是实现这一目标的方式,我唯一担心的是从我的集成层迁移到我的应用程序层的对象是DAO,出于某种原因,我认为使它们成为EJB似乎是错误的。我错了吗 ? – eitanfar
@eitanfar如果你为此使用EJB,那么它就是你的接口层,应该是EJB(无状态会话bean),而不是DAO本身!我实现这个的方式是为接口 - >组件服务接口 - >组件服务实现 - >内部DAO提供一个EJB层。这允许最大程度的解耦和我所需要关注的分离。另外,对于我所有的EJB,都有一个实际用于查找的单独EJB委托,所以EJB查找完成的事实对于应用程序层是不可见的。那么EJB委托可以用作POJO。 – eis
我的确意识到这可能比你想要的更分层,当然这不是强制性的。 – eis