将EJB注入servlet

时间:2013-08-19 15:28:02

标签: java servlets dependency-injection ejb weblogic

我用Google搜索,试图理解为什么Weblogic 10.3.4没有将EJB注入到servlet的带注释字段中。

Ear包含定义DAO EJB的ejb.jar和带有TestServlet的web.war。

PluginDataDAO.java

@Stateless
public class PluginDataDAO implements IPluginDataDAO {

}

IPluginDataDAO.java

@Local
public interface IPluginDataDAO  {

}

TestServlet.java

public class TestServlet extends HttpServlet {
    @EJB(mappedName = "PluginDataDAO")
    private IPluginDataDAO pluginDataDAO;
}

web.xml

<web-app version="2.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID">
<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>cz.literak.blog.j2ee.TestServlet</servlet-class>
</servlet>

Servlet位于ejb.jar中的web.war,EJB内部。没有运气,我尝试使用/不使用映射名称属性的注释。当我尝试将web.xml升级到3.0时,部署失败,未枚举3.0。怎么了?为什么pluginDataDAO仍然为空?谢谢。

4 个答案:

答案 0 :(得分:5)

以下组合工作:

的Servlet

@EJB
private IPluginDataDAO pluginDataDAO;

的web.xml

...
  <ejb-local-ref>
    <ejb-ref-name>PluginDataDAO</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>cz.literak.blog.j2ee.dao.IPluginDataDAO</local>
  </ejb-local-ref>
...

我认为添加对web.xml的引用不是必需的..有什么规则,何时添加它们?

答案 1 :(得分:5)

我遇到了同样的问题,并使用@ManagedBean解决了问题:

@ManagedBean
public class TestServlet extends HttpServlet {
    @EJB(mappedName = "PluginDataDAO")
    private IPluginDataDAO pluginDataDAO;

答案 2 :(得分:2)

至于Servlet 3问题; WebLogic 10.3.x是Java EE 5实现,意味着它仅支持Servlet 2.5。

该示例应该可行。也许尝试一个只有Servlet和EJB的全新项目。

也可以使用最新的WebLogic 12.1.2尝试相同的代码。它可以在Oracle站点免费下载。

答案 3 :(得分:1)

我认为这个链接有很好的答案...... Injecting a stateless EJB into Servlet ...

这个家伙Balus说你试图在构造函数中使用DI这是不正确的...最早你可以设置它在init()....只是复制了希望别人会发现有用的答案