Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Debugging Spring configuration

I am working on a Java application that uses Spring and Hibernate and runs on a Websphere. I have run into a problem, where I expect Spring to load a Dao into my object, but for some reason that doesn't happen. (Another Dao that is specified in much the same way is loaded fine.)

The question is - how can I debug how Spring decides what to load in? Can I turn on logging for Spring, and where?

like image 495
jprusakova Avatar asked Oct 20 '11 17:10

jprusakova


People also ask

How do you debug a spring configuration?

If you use Spring Boot, you can also enable a “debug” mode by starting your application with a --debug flag. You can also specify debug=true in your application.

What is @configuration in spring boot?

Spring @Configuration annotation is part of the spring core framework. Spring Configuration annotation indicates that the class has @Bean definition methods. So Spring container can process the class and generate Spring Beans to be used in the application.


1 Answers

Yes, Spring framework logging is very detailed, You did not mention in your post, if you are already using a logging framework or not. If you are using log4j then just add spring appenders to the log4j config (i.e to log4j.xml or log4j.properties), If you are using log4j xml config you can do some thing like this

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

or

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

I would advise you to test this problem in isolation using JUnit test, You can do this by using spring testing module in conjunction with Junit. If you use spring test module it will do the bulk of the work for you it loads context file based on your context config and starts container so you can just focus on testing your business logic. I have a small example here

@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);     } } 

UPDATE

I am not advising you to change the way you load logging but try this in your dev environment, Add this snippet to your web.xml file

<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 config file


I tested this on my local tomcat and it generated a lot of logging on application start up. I also want to make a correction: use debug not info as @Rayan Stewart mentioned.

<?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> 
like image 130
Prasanna Talakanti Avatar answered Sep 28 '22 07:09

Prasanna Talakanti