Resolución de problemas de CDI (Contexts and Dependency Injection)
Resolver problemas debidos a errores relacionados con CDI (Contexts and Dependency Injection) para las aplicaciones Java™ Platform, Enterprise Edition (Java EE).
Antes de empezar
Acerca de esta tarea
Cuando se utiliza una implementación CDI, es posible que se produzcan errores durante el despliegue de la aplicación o cuando CDI interactúa con otros componentes de Java EE. Es posible que también tenga problemas con los generadores, interceptores y decoradores o con el rastreo de diagnóstico. Utilice esta tarea para arreglar estos errores que podrían producirse.
Procedimiento
- Resolución de problemas durante el despliegue de aplicaciones. En el momento del despliegue de aplicaciones, el contenedor debe validar cada punto de inyección de la aplicación y sólo se satisface por un origen de dicha dependencia.
Avoid trouble: No se soporta el despliegue directo en aplicaciones CDI. Para que la actualización esté disponible, debe reiniciar la aplicación.gotcha
- Resuelva la dependencia ambigua.
Se produce una dependencia ambigua, o excepción javax.enterprise.inject.AmbiguousResolutionException, cuando el contenedor resuelve un tipo de punto de inyección y calificadores en más de un bean gestionado, método de generador o campo de generador.
La excepción revela el punto de inyección que se estaba procesando y los beans de candidados que permanecían al final del proceso de resolución de tipo seguro. Cualquier cosa que no sea un bean único es un error de aplicación.
Para resolver el error, lleve a cabo una de las acciones siguientes:org.jboss.weld.exceptions.DeploymentException: WELD-001409: Dependencias ambiguas para el tipo OtherBean con calificadores @Default en el punto de inyección [BackedAnnotatedField] @Inject private basic.injection.SimpleBean.bean en basic.injection.SimpleBean.bean(SimpleBean.java:0) Dependencias posibles: - Bean gestionado [class basic.injection.OtherBean] con calificadores [@Any @Default], - Método generador [OtherBean] con calificadores [@Any @Default] declarados como [[BackedAnnotatedMethod] @Produces basic.injection.OtherBeanProducer.produceOtherBean()]
- Desambigüe el punto de inyección añadiendo un calificador al punto de inyección, si es necesario, un origen de la dependencia.
- Si es necesario, anote uno de los orígenes de las instancias contextuales con @Alternative o @Specializes, si algunas de las dependencias no deben tenerse en cuenta para la inyección.
- Resuelva una dependencia que no se puede satisfacer. Una dependencia que no se puede satisfacer, o javax.enterprise.inject.UnsatisfiedResolutionException, se produce cuando no hay un origen correspondiente para objetos que coinciden con un punto de inyección en la aplicación. El tipo de API del campo, junto con el conjunto opcional de anotaciones de calificador, dicta el conjunto de beans que son válidos para satisfacer la dependencia. Las causas de una dependencia que no se puede satisfacer son las siguientes:
- No existe ningún bean gestionado que pueda asignarse al tipo en el punto de inyección.
- No existe ningún método de generador de ningún bean gestionado cuyo tipo de retorno pueda signarse al punto de inyección.
- No hay ningún campo de generador en ningún bean gestionado cuyo tipo pueda asignarse al punto de inyección.
- Uno de los casos de ejemplo mencionados anteriormente es válido, pero las anotaciones calificadoras en el punto de inyección no están presentes en el bean o el generador.
Nota: Resuelva el error haciendo que una dependencia con el tipo API y los calificadores esté disponible introduciendo un nuevo bean, eliminando calificadores o añadiendo campos o métodos generadores. La sección 5.2 de la especificación Contexts and Dependency Injection para Java describe de forma detallada la resolución de tipo seguro.org.jboss.weld.exceptions.DeploymentException: WELD-001408: Dependencias no satisfechas para el tipo OtherBean con calificadores @British en el punto de inyección [BackedAnnotatedField] @Inject @British private basic.injection.SimpleBean.bean en basic.injection.SimpleBean.bean(SimpleBean.java:0) WELD-001475: Los siguientes beans coinciden por tipo, pero ninguno tiene calificadores coincidentes: - Bean gestionado [class basic.injection.OtherBean] con calificadores [@Any @Default], - Método generador [OtherBean] con calificadores [@Any @Default] declarados como [[BackedAnnotatedMethod] @Produces basic.injection.OtherBeanProducer.produceOtherBean()]
- Resuelva las dependencias de ámbito de desactivación. La desactivación es la acción de mover un objeto desocupado que se mantiene en el almacenamiento auxiliar de la memoria. Un ámbito de desactivación, como por ejemplo los ámbitos incorporados, @SessionScoped y @ConversationScoped, requiere que cualquier bean que utilice el ámbito tenga capacidad de desactivación. Un bean tiene capacidad de desactivación si es un bean de sesión con estado o es cualquier otro bean gestionado que sea serializable y a la vez no tenga interceptores y decoradores no serializables. Entre las causas de las dependencias de ámbito de desactivación se incluyen las siguientes:
- Cambiar el ámbito de un bean existente por un ámbito de desactivación, como @SessionScoped y @ConversationScoped.
- Añadir decoradores o interceptores no serializables a un bean que pueda desactivarse.
- Asegúrese de que el bean en cuestión sea serializable.
- Asegúrese de que todos los interceptores y decoradores del bean implementen la serialización.
- Cambie el ámbito del bean gestionado por un ámbito de no desactivación.
- Resuelva la dependencia ambigua.
- Resuelva los errores que se producen como consecuencia de la interacción de CDI con otros componentes de Java EE.
La anotación @Inject proporciona un tipo adicional de inyección de dependencia Java EE. Su relación con la inyección que se define en Java EE 5 es la siguiente:
- Las inyecciones que utilizan anotaciones distintas a la anotación @Inject se comportan como en los releases anteriores, y sólo las dependencias inyectadas utilizando la anotación @Inject son instancias contextuales tal como se define en Contexts and Dependency Injection para Java (JSR299).
- Utilice campos de generador y métodos de generador para proporcionar características CDI limitadas (por ejemplo inyección de tipo seguro) de dependencias de Java EE obtenidas utilizando las anotaciones @Resource, @PersistenceContext, @PersistenceUnit y @WebServiceRef.
Si no puede obtener un valor para una referencia de EL (lenguaje de expresión) a un bean gestionado para componentes JavaServer Pages (JSP) y JavaServer Faces (JSF), tenga en cuenta los procedimientos siguientes:- Asegúrese de que la clase de bean se anota utilizando la anotación @Named o se anota con un estereotipo que define la anotación @Named.
- Asegúrese de que la expresión EL coincide con el nombre de la clase de bean después de convertir el primer carácter a minúsculas. Al utilizar el calificador de anotación @Named con un miembro de valor (por ejemplo @Named("myName")), se especifica el nombre de bean (un calificador de caso especial) pero no cambia el nombre EL de ese bean.
Para componentes EJB:- Puede inyectar beans de sesión con las anotaciones @Inject y @EJB. Cuando se inyectan beans de sesión con estado con la anotación @Inject, los beans de sesión pueden aprovechar la inyección de tipo seguro utilizando calificadores y pueden hacer que su ámbito CDI gestione su ciclo de vida.
- Los beans de sesión son aptos para la interceptación y decoración incluso cuando no se han obtenido con la anotación @Inject, a diferencia de otros beans gestionados.
Para componentes de servicio web :- Para desarrollar un cliente JAX-WS a partir de un archivo WSDL (Web Services
Description Language), siga los pasos descritos en el tema Desarrollo de un
cliente JAX-WS a partir de un archivo WSDL. Consejo: Utilice la herramienta wsimport para generar artefactos Java portátiles, incluida una clase de servicio.
- Si desea inyectar la clase de servicio generada en un bean gestionado por CDI, utilizando la anotación @WebServiceRef, debe invocar la herramienta wsimport utilizando el argumento -wsdllocation. Como resultado, la clase de servicio generada puede ser transferida a otros sistemas porque la clase de servicio hace referencia al archivo WSDL utilizando un URI relativo, en lugar de una vía de acceso absoluta.
- Solucionar errores del generador.
- Bucles en los métodos de generador. Cuando se utiliza un método de generador, cada parámetro se trata como un punto de inyección en que el contenedor proporciona la dependencia. Por lo tanto, el origen de los objetos contextuales que cumplen los puntos de inyección de dichos parámetros no deben ser la misma clase que contiene el método de generador.
- Métodos de generador duplicados (dos anotaciones @Produces con los mismos calificadores en la misma clase). Si una clase tiene varios campos de generador, estos campos no pueden tener el mismo tipo de API y un conjunto idéntico de calificadores, ya que una dependencia ambigua garantizada de este tipo no sería inyectable.
- Resolución de errores de interceptor y decorador.
Avoid trouble: En el escenario de migración tras error, no se soportan @Inject Validator e @Inject ValidatorFactory.gotcha
- Habilitar interceptores, interceptores de habilitación de decoradores y decoradores en el archivo beans.xml o a través de @Priority. Todos los beans excepto los beans de sesión EJB se aplican sólo a las instancias contextuales de los beans. Las instancias contextuales son instancias obtenidas utilizando la anotación @Inject o llamando a métodos en la interfaz BeanManager.
- Interceptores y decoradores en varios archivos de despliegue de bean (BDA). Si los interceptores o decoradores se habilitan a través del archivo beans.xml, estos interceptores o decoradores se habilitan sólo para ese archivo. Si los interceptores o decoradores se habilitan a través de @Priority, los interceptores o decoradores se habilitan para la aplicación entera.
- Utilice el rastreo de diagnóstico para ayudarle a determinar por qué se ha
producido un error.
- Obtenga un rastreo para CDI especificando JCDI=all:com.ibm.ws.cdi*=all:org.jboss.weld*=all.
- Obtenga un rastreo adicional para interactuar con la inyección de Java EE y el contenedor EJB especificando EJBContainer=all:MetaData=all:Injection=all.
- Obtenga un rastreo adicional para interactuar con ámbitos relacionados con la web y ciclos de vida especificando all:com.ibm.ws.wswebcontainer*=all.
- Evite operaciones pesadas en los constructores predeterminados de los beans
gestionados.
Cada punto de inyección de un determinado bean gestionado recibe un nuevo proxy del cliente que llama al constructor predeterminado de la clase de bean subyacente, además de la instancia de bean real que se podría crear utilizando el proxy. Además, dado que las inyecciones de dependencia se producen una vez que se ha completado el constructor, los constructores no pueden utilizar dependencias inyectadas. Consulte el retorno de llamada de ciclo de vida de anotación @PostConstruct para encontrar un lugar para poner la lógica posterior a la inyección que se ejecuta sólo en la instancia subyacente.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tweb_troubleshoot_cdi
File name: tweb_troubleshoot_cdi.html