Mecanismo de inyección de fuente de datos Tomcat 7

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.