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.
I had the same problem and solved it with @ManagedBean
:
@ManagedBean
public class TestServlet extends HttpServlet {
@EJB(mappedName = "PluginDataDAO")
private IPluginDataDAO pluginDataDAO;
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?
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With