Estoy tratando de crear una aplicación web simple. Y pegado en la inyección de fuente de datos. Parece que hay varios problemas. Entonces partiré de mi confusión. Según tengo entendido, hay 2 (al menos) formas de inyectar el DataSource en Servlet:
muestra web.xml
jdbc/MyDB javax.sql.DataSource Container ua.test.TestServlet dataSource
Muestra de recursos
public class TestServlet extends HttpServlet{ @Resource private DataSource dataSource; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Mi confusión: web.xml
no funciona en Tomcat 7 en mi proyecto simple. En mi opinión, la opción web.xml
debería funcionar ya que no había anotaciones antes de Java 5. Por favor explique.
Actualizar:
Configuración de fuente de datos
Intente eliminar la entrada de injection-target
en web.xml
y use el atributo de name
en la anotación @Resource
:
public class TestServlet extends HttpServlet { @Resource(name = "jdbc/MyDB") private DataSource dataSource; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
Eso funcionó en mis pruebas locales con Tomcat 7.0.50. Si estás buscando la manera de hacerlo sin anotaciones, no conseguí que funcionara, a pesar de que debería tener su registro de cambios 1 .
EDITAR
Todavía no he encontrado una solución, pero tenía curiosidad por saber por qué esto no funciona, así que eché un vistazo al código de injection-target
la injection-target
. Descubrí que primero carga la entrada context.xml
y recoge las configuraciones de web.xml
, pero elige no anular la configuración que encontró en context.xml
porque ya ve una entrada jdbc/MyDB
. No estoy seguro de cómo obtener la configuración de injection-target
la injection-target
en context.xml
o la configuración de la base de datos como driverClassName
en web.xml
.
Que yo sepa, Tomcat es un buen contenedor de servlets, pero no es un contenedor completo de Java EE. Desde The BalusC Code: ¿Cómo instalar CDI en Tomcat? , Creo que fuera de la caja Tomcat no es capaz de hacer ninguna dependency injection. Tomcat solo funciona perfectamente asociado con Spring, porque es ligero.
Si no quiere usar Spring, el enlace que escribí anteriormente debería darle algunas formas de hacer CDI con tomcat ( TomEE en lugar de tomcat, Weld o OpenWebBeans ).
EDITAR:
Aparentemente, las versiones recientes de tomcat 7 deberían aceptar DI – vea más abajo el enlace en el comentario de davidfmatheson.