2011-01-31 16 views
22

Una delle bellezze con Java EE 6 è il nuovo framework di integrazione delle dipendenze - CDI con l'implementazione di riferimento Weld - che ci ha spinto a iniziare la migrazione internamente a JSR-330 in modo agonistico di implementazione, con l'obiettivo esplicito di essere in grado di avere un barattolo di base che è congelato e quindi essere in grado di aggiungere vasetti aggiuntivi che forniscono nuovi moduli che sostituiscono la funzionalità nel barattolo principale.Quali sono i migliori trucchi di debugging con Weld/CDI?

Sono ora in procinto di eseguire il suddetto lavoro con Weld, e ad essere sincero c'è semplicemente troppa magia in corso dietro le copertine. O funziona o no, e non fornisce molto aiuto di default su ciò che accade in modo da poter indagare su cosa è sbagliato e risolverlo.

mi aspetterei che ci sono interruttori per passare che può facilmente abilitare le cose come:

  • Quali voci classpath vengono analizzati e dove? Qual'era il risultato?
  • Quali fagioli sono disponibili per l'iniezione per quale classe?
  • Che cosa ha impedito di prendere in considerazione un determinato bean per dopo? Un vaso dato?

In altre parole, ho bisogno di vedere il processo decisionale in modo molto più dettagliato. Per qualche ragione questo non è necessario con Guice, forse perché c'è molta meno magia e forse perché i messaggi di errore sono molto buoni.

Che cosa si fa per eseguire il debug delle applicazioni di saldatura e quanto aiuta?

risposta

4

posso suggerire alcune opzioni:

  • inferiore alla soglia di registrazione. Non so che cosa quadro di registrazione viene utilizzato da saldare, ma si può vedere che e configurare, per esempio, o DEBUGINFO

  • ottenere il codice sorgente e mettere i punti di interruzione nel BeanManager implementazione (BeanManagerImpl forse). È la classe principale in CDI e gestisce quasi tutto.

  • Provare a mettere un'implementazione diversa (se non legata dal server dell'applicazione) - ad esempio OpenWebBeans. I suoi messaggi di eccezione potrebbero essere migliori

  • Aprire la specifica e leggere il caso particolare. Spesso capita di non aver rispettato una condizione preliminare - ad esempio un'annotazione deve avere uno specifico @Target, altrimenti non viene gestito da CDI.

Posso confermare che i messaggi di eccezione di Weld sono piuttosto deludenti. Non ho usato Guice, ma in primavera sono molto, molto istruttivo. Con Weld ho dovuto fare riferimento al 4 ° punto sopra (ha aperto la specifica) e verificare tutte le precondizioni. Questo era inizialmente il mio sospetto: anche se le specifiche sembrano molto buone, le implementazioni non saranno così brillanti (almeno all'inizio). Ma immagino che ci si abitui a questo.

+0

Non sono legato in questo momento dal server delle applicazioni. Sono i progetti di come realizzare il "jar principale congelato + jar di funzionalità extra" in ogni provider JSR-330, che sto facendo ora per CDI. OpenWebBeans ha una migliore segnalazione degli errori? Hai dato un'occhiata all'implementazione CanDI in resina? La mia configurazione di registrazione può tagliare i registri di DEBUG, darò un'occhiata. –

+0

Non ho avuto alcuna esperienza con OWB o CanDI. Solo Weld, e non troppo in realtà. – Bozho

+0

OpenWebBeans ad es. registra i file JAr scansionati. Se ti manca qualcosa crea un problema JIRA. Sono molto innovativi e immagino che implementeranno tali funzionalità. –

9

Risposta breve: non esiste alcuna opzione dedicata debug per CDI (come nulla di simile è richiesto dalle specifiche), e nessuna opzione di debug dedicata per saldatura.

lungo Risposta: C'è molto che si può fare da soli.Familiarizzare con la extension mechanism of CDI, e scoprirete che si può facilmente (davvero!) Scrivere il proprio interno che esegue il debug delle informazioni necessarie

Quali voci classpath vengono acquisiti e dove? Qual'era il risultato?

Ascolta il ProcessAnnotatedType -Event

Quali i fagioli sono disponibili per l'iniezione per quale classe?

Interrogare il BeanManager per quello.

Cosa ha impedito di considerare un dato bean per per dopo? Un vaso dato?

Ascolta il AfterBeanDiscovery -Evento e guarda cosa hai nel BeanManager. Fondamentalmente, i seguenti scenari fanno un ManageBean inammissibili iniettabile:

+2

Belle informazioni. Sei a conoscenza di qualcuno che ha scritto un modulo "rilascia questo e ricevi molte informazioni", invece di dover prima fare la ricerca dei prerequisiti? –

+0

Nessuna estensione di cui sono a conoscenza. Sarebbe un bel contributo per Seam/CODI però ... –

+0

Non penso che funzioni perché non è possibile specificare l'ordine delle estensioni. Quindi un'estensione chiamata in seguito può ancora cambiare il gioco. –

3

Weld utilizza la registrazione semplice per Java (sl4j). Se si utilizza Tomcat, ti suggerisco di aggiungere sl4j-jdk14-x.x.x.jar al percorso classe di applicazione e aggiungere le righe seguenti al 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 

Questo genererà un sacco di debug console, in modo da `d meglio selezionare qualcosa di specifico e commentare altri Linee.

Altre librerie di registrazione (come log4j) possono essere configurate utilizzando i rispettivi file di configurazione e aggiungendo livelli simili.

Problemi correlati