2011-01-31 21 views
22

Una de las bellezas con Java EE 6 es el nuevo marco de inyección de dependencias - CDI con la implementación de referencia Weld - que nos ha impulsado a comenzar a migrar internamente a JSR-330 de una manera independiente de la implementación, con el objetivo explícito de poder tener un tarro central que está congelado, y luego poder agregar tarros adicionales proporcionando nuevos módulos reemplazando la funcionalidad en el tarro principal.¿Cuáles son los mejores trucos de depuración con Weld/CDI?

Ahora estoy en el proceso de hacer que lo anterior funcione con Weld, y para ser sincero, simplemente hay demasiada magia detrás de las cubiertas. O funciona o no funciona, y no proporciona mucha ayuda por defecto sobre lo que sucede para que pueda investigar qué es lo que está mal y solucionarlo.

Yo esperaría que hay interruptores para cambiar lo que puede permitir fácilmente cosas como:

  • Qué entradas de ruta de clases son escaneados y dónde? ¿Cuál fue el resultado?
  • ¿Qué granos están disponibles para inyección para qué clase?
  • ¿Qué causó que un frijol determinado no se considere para más adelante? ¿Un frasco dado?

En otras palabras, necesito ver el proceso de decisión con mucho más detalle. Por alguna razón, esto no es tan necesario con Guice, tal vez porque hay mucha menos magia, y tal vez porque los mensajes de error son muy buenos.

¿Qué hace para depurar sus aplicaciones de soldadura, y cuánto ayuda?

Respuesta

4

puedo sugerir algunas opciones:

  • inferior al umbral de registro. No sé qué marco de registro es utilizado por Weld, pero se puede ver que y configurar, por ejemplo, DEBUG o INFO

  • obtener el código fuente y poner puntos de interrupción en la ejecución BeanManager (BeanManagerImpl tal vez). Es la clase principal en CDI y maneja casi todo.

  • Intente poner una implementación diferente (si no está vinculada por el servidor de aplicaciones) - por ejemplo OpenWebBeans. Sus mensajes de excepción podrían ser mejores

  • Abra la especificación y lea sobre el caso particular. A menudo ocurre que ha omitido una condición previa determinada; por ejemplo, una anotación debe tener un @Target específico; de lo contrario, no es manejada por CDI.

Puedo confirmar que los mensajes de excepción de Weld son bastante decepcionantes. No he usado Guice, pero en Spring son muy, muy informativos. Con Weld tuve que referirme al cuarto punto anterior (abrí la especificación) y verifiqué todas las precondiciones. Inicialmente, esta fue mi sospecha: aunque las especificaciones se vean muy bien, las implementaciones no serán tan brillantes (al menos al principio). Pero supongo que uno se acostumbra a esto.

+0

No estoy vinculado ahora por el servidor de aplicaciones. Son los planos de cómo hacer el "jar de núcleo congelado + jar de funcionalidad adicional" en cada proveedor de JSR-330, que estoy haciendo para CDI ahora. ¿OpenWebBeans tiene mejores informes de errores? ¿Has echado un vistazo a la implementación de CanDI en Resin? Mi configuración de registro puede cortar los registros de DEPURACIÓN, eche un vistazo. –

+0

No he tenido ninguna experiencia con OWB o CanDI. Solo Weld, y no demasiado en realidad. – Bozho

+0

OpenWebBeans p. registra los archivos JAr escaneados. Si se pierde algo, cree un problema JIRA. Son muy innovadores y creo que implementarán tales características. –

9

Respuesta breve: no hay una opción de depuración dedicada para CDI (ya que la especificación no lo requiere) y no hay una opción de depuración dedicada para Weld.

Respuesta larga: hay mucho que puedes hacer por tu cuenta.Familiarizarse con el extension mechanism of CDI, y descubrirá que puede fácilmente (de verdad!) Escribir su propia extensión que depura la información requerida

Qué entradas de ruta de clases se escanean y dónde? ¿Cuál fue el resultado?

Escucha la ProcessAnnotatedType -Evento

Lo granos están disponibles para la inyección para qué clase?

Consulta el BeanManager para eso.

¿Qué causó que un grano dado no sea considerado para más tarde? ¿Un frasco dado?

Escuche el AfterBeanDiscovery -Event y vea lo que tiene en el BeanManager. Básicamente, los siguientes escenarios hacen una ManageBean inelegible para la inyección:

+2

Buena información. ¿Conoces a alguien que haya escrito un "módulo de introducción y obtención de mucha información", en lugar de tener que hacer primero la investigación de requisitos previos? –

+0

Sin extensión de la que tenga conocimiento. Sería una buena contribución a Seam/CODI aunque ... –

+0

No creo que funcione porque no puede especificar el orden de las extensiones. Entonces, una extensión que se llame después puede cambiar el juego. –

3

Weld utiliza el registro simple para Java (sl4j). Si está utilizando Tomcat, sugiero agregar sl4j-jdk14-x.x.x.jar a la ruta de clase de aplicaciones y añadirla siguientes líneas a apache-tomcat-7.0.x/conf/logging.properties:

org.jboss.weld.Bootstrap.level = FINEST 
org.jboss.weld.Version.level = FINEST 
org.jboss.weld.Utilities.level = FINEST 
org.jboss.weld.Bean.level = FINEST 
org.jboss.weld.Servlet.level = FINEST 
org.jboss.weld.Reflection.level = FINEST 
org.jboss.weld.JSF.level = FINEST 
org.jboss.weld.Event.level = FINEST 
org.jboss.weld.Conversation.level = FINEST 
org.jboss.weld.Context.level = FINEST 
org.jboss.weld.El.level = FINEST 
org.jboss.weld.ClassLoading.level = FINEST 

Esto generará un montón de depuración en la consola, por lo que usted el `d mejor seleccionar algo específico y comentar otra líneas.

Otras bibliotecas de registro (como log4j) pueden configurarse usando sus respectivos archivos de configuración y agregando niveles similares.

Cuestiones relacionadas