Injecting EJB into servlet

2019-04-07 08:47发布

I googled without luck trying to understand why Weblogic 10.3.4 does not inject EJB into annoted field in servlet.

Ear contains ejb.jar defining DAO EJB and web.war with TestServlet.

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 is inside web.war, EJB in ejb.jar. I tried the annotation with/without mapped name attribute without luck. When I tried to upgrade web.xml to 3.0, deployment failed that 3.0 is not enumerated. What is wrong? Why is pluginDataDAO still null? Thank you.

4条回答
SAY GOODBYE
2楼-- · 2019-04-07 09:26

I had the same problem and solved it with @ManagedBean:

@ManagedBean
public class TestServlet extends HttpServlet {
    @EJB(mappedName = "PluginDataDAO")
    private IPluginDataDAO pluginDataDAO;
查看更多
地球回转人心会变
3楼-- · 2019-04-07 09:26

I think there is very good answer in this link...Injecting a stateless EJB into Servlet...

this guy Balus is saying you are trying to use DI in constructor which is not correct...earliest you can set it is in init() ....just copied the answer hoping someone else would find usefull

查看更多
神经病院院长
4楼-- · 2019-04-07 09:28

As for the Servlet 3 issue; WebLogic 10.3.x is a Java EE 5 implementation meaning it only supports Servlet 2.5.

The example should work though. Maybe try a completely new project with only that Servlet and EJB in it.

Also try the same code with the latest WebLogic 12.1.2. It can be downloaded for free at the Oracle site.

查看更多
小情绪 Triste *
5楼-- · 2019-04-07 09:41

Following combination works:

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>
...

I thought that adding references to web.xml is not neccessary .. What are the rules, when to add them?

查看更多
登录 后发表回答