Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Injecting EJB into servlet

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.

like image 279
Leos Literak Avatar asked Aug 19 '13 15:08

Leos Literak


4 Answers

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

@ManagedBean
public class TestServlet extends HttpServlet {
    @EJB(mappedName = "PluginDataDAO")
    private IPluginDataDAO pluginDataDAO;
like image 80
user3122855 Avatar answered Sep 30 '22 11:09

user3122855


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?

like image 33
Leos Literak Avatar answered Sep 30 '22 12:09

Leos Literak


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.

like image 20
Mike Braun Avatar answered Sep 30 '22 13:09

Mike Braun


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

like image 21
BatBold Avatar answered Sep 30 '22 11:09

BatBold