web-dev-qa-db-fra.com

Débogage de la configuration de printemps

Je travaille sur une application Java qui utilise Spring et Hibernate et s'exécute sur une Websphere. J'ai rencontré un problème. Spring s'attend à charger un Dao dans mon objet, mais pour une raison quelconque. cela ne se produit pas. (Un autre Dao qui est spécifié à peu près de la même manière est chargé correctement.)

La question est - comment puis-je déboguer comment Spring décide quoi charger? Puis-je activer la journalisation pour Spring, et où?

59
jprusakova

Oui, la journalisation du framework Spring est très détaillée. Vous n’avez pas mentionné dans votre message si vous utilisez déjà un framework de journalisation ou non. Si vous utilisez log4j, ajoutez simplement des ajouts printaniers à la configuration log4j (c'est-à-dire à log4j.xml ou log4j.properties). Si vous utilisez la configuration log4j xml, vous pouvez procéder de la sorte.

<category name="org.springframework.beans">
    <priority value="debug" />
</category>

ou

<category name="org.springframework">
    <priority value="debug" />
</category>

Je vous conseillerais de tester ce problème séparément en utilisant le test JUnit. Vous pouvez le faire en utilisant module de test de ressort en conjonction avec Junit . Si vous utilisez un module de test de ressort, il effectuera l'essentiel du travail. Il charge le fichier de contexte en fonction de votre configuration de contexte et démarre le conteneur afin que vous puissiez simplement vous concentrer sur le test de votre logique métier. J'ai un petit exemple ici

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:springContext.xml"})
@Transactional
public class SpringDAOTest 
{
    @Autowired
    private SpringDAO dao;

    @Autowired
    private ApplicationContext appContext;

    @Test
    public void checkConfig()
    {
        AnySpringBean bean =  appContext.getBean(AnySpringBean.class);
        Assert.assertNotNull(bean);
    }
}

MISE À JOUR

Je ne vous conseille pas de changer la façon dont vous chargez la journalisation mais essayez ceci dans votre environnement de développement, ajoutez cet extrait à votre fichier web.xml.

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

UPDATE log4j fichier de configuration


J'ai testé cela sur mon Tomcat local et cela a généré beaucoup de journalisation au démarrage de l'application. Je veux aussi faire une correction: utiliser déboguer pas info comme @ Rayan Stewart a mentionné.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/" debug="false">
    <appender name="STDOUT" class="org.Apache.log4j.ConsoleAppender">
        <param name="Threshold" value="debug" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{HH:mm:ss} %p [%t]:%c{3}.%M()%L - %m%n" />
        </layout>
    </appender>

    <appender name="springAppender" class="org.Apache.log4j.RollingFileAppender"> 
        <param name="file" value="C:/tomcatLogs/webApp/spring-details.log" /> 
        <param name="append" value="true" /> 
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{MM/dd/yyyy HH:mm:ss}  [%t]:%c{5}.%M()%L %m%n" />
        </layout>
    </appender>

    <category name="org.springframework">
        <priority value="debug" />
    </category>

    <category name="org.springframework.beans">
        <priority value="debug" />
    </category>

    <category name="org.springframework.security">
        <priority value="debug" />
    </category>

    <category
        name="org.springframework.beans.CachedIntrospectionResults">
        <priority value="debug" />
    </category>

    <category name="org.springframework.jdbc.core">
        <priority value="debug" />
    </category>

    <category name="org.springframework.transaction.support.TransactionSynchronizationManager">
        <priority value="debug" />
    </category>

    <root>
        <priority value="debug" />
        <appender-ref ref="springAppender" />
        <!-- <appender-ref ref="STDOUT"/>  -->
    </root>
</log4j:configuration>
62
Prasanna Talakanti

Si vous utilisez Spring Boot, vous pouvez également activer le mode "débogage" en démarrant votre application avec un indicateur --debug.

Java -jar myapp.jar --debug

Vous pouvez également spécifier debug = true dans votre application.properties.

Lorsque le mode de débogage est activé, une sélection de consignateurs principaux (conteneur intégré, Hibernate et Spring Boot) est configurée pour générer davantage d'informations. L'activation du mode débogage ne configure pas votre application pour enregistrer tous les messages avec le niveau DEBUG.

Vous pouvez également activer un mode "trace" en démarrant votre application avec un indicateur --trace (ou trace = true dans votre application.properties). Cela active la consignation de trace pour une sélection de consignateurs principaux (conteneur incorporé, génération de schéma Hibernate et l'ensemble du portefeuille Spring).

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html

6
Anton Yuriev