调试弹簧配置
我正在开发一个Java应用程序,它使用Spring和Hibernate并在Websphere上运行。我遇到了一个问题,我希望Spring将一个道加载到我的对象中,但由于某种原因,这并没有发生。(以大致相同的方式指定的另一个 Dao 加载正常。
问题是 - 我如何调试Spring如何决定加载什么?我可以打开春季日志记录吗,在哪里?
我正在开发一个Java应用程序,它使用Spring和Hibernate并在Websphere上运行。我遇到了一个问题,我希望Spring将一个道加载到我的对象中,但由于某种原因,这并没有发生。(以大致相同的方式指定的另一个 Dao 加载正常。
问题是 - 我如何调试Spring如何决定加载什么?我可以打开春季日志记录吗,在哪里?
是的,Spring框架日志记录非常详细,您在帖子中没有提到,如果您已经在使用日志记录框架。如果您使用的是log4j,那么只需将弹簧追加器添加到log4j配置中(即log4j.xml或log4j.properties),如果您使用的是log4j xml配置,则可以执行类似如下操作
<category name="org.springframework.beans">
<priority value="debug" />
</category>
或
<category name="org.springframework">
<priority value="debug" />
</category>
我建议你使用JUnit测试来单独测试这个问题,你可以通过将弹簧测试模块与Junit结合使用来做到这一点。如果您使用spring测试模块,它将为您完成大部分工作,它会根据您的上下文配置加载上下文文件并启动容器,因此您可以专注于测试业务逻辑。我在这里有一个小例子
@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);
}
}
我不建议你更改加载日志记录的方式,而是在你的开发环境中尝试此操作,将此代码段添加到你的 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>
更新日志4j配置文件
我在我的本地tomcat上测试了这一点,它在应用程序启动时生成了很多日志记录。我还想做一个更正:使用调试而不是像斯图尔特@Rayan提到的那样信息。
<?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>
如果使用 Spring Boot,还可以通过使用 --debug 标志启动应用程序来启用“调试”模式。
java -jar myapp.jar --debug
还可以在 application.properties 中指定 debug=true。
启用调试模式后,将配置一系列核心记录器(嵌入式容器、休眠和 Spring Boot)以输出更多信息。启用调试模式不会将应用程序配置为以 DEBUG 级别记录所有消息。
或者,可以通过使用 --trace 标志(或在 application.properties 中为 trace=true)启动应用程序来启用“跟踪”模式。这样做可以为一系列核心记录器(嵌入式容器,Hibernate模式生成和整个Spring产品组合)启用跟踪日志记录。
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html