@autowired annotation issue, not injecting bean in class, using Spring3.0, hibernate

29,745

Solution 1

StockTraderLogger is not declared as spring bean and doesn't exist in spring context and for that reason the injection won't work.

<bean id="StockTraderLogger" class="com.abc.trade.util.StockTraderLogger"/>

or

@Component
public class StockTraderLogger { /**/ }

Solution 2

Here the problem is in debug method:

    StockTraderLogger stl =new StockTraderLogger();

This is not spring managed. You can inject Spring managed bean into non-managed one in two ways. Here you can inject configService in StockTraderLogger as:

1) By AutowireCapableBeanFactory:

    ApplicationContext ctx = new ClassPathXmlApplicationContext("beansdefinition.xml");
    StockTraderLogger stl = new StockTraderLogger();
    ctx.getAutowireCapableBeanFactory().autowireBeanProperties(stl, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);

2) By using Spring AOP @Configurable annotation which marks a class as eligible for Spring-driven configuration(like objects instantiated with the 'new' operator).

    @Configurable
    public class StockTraderLogger {
    ...
    }

and specifying this <context:spring-configured/> in beansdefinition.xml. 

You can find more information about this spring aop way here.

Solution 3

Add this to applicationContext.xml:

xmlns:mvc="http://www.springframework.org/schema/mvc"

and

http://www.springframework.org/schema/mvc to xsi:schemalocation

mvc-annotation driven is required for annotated controllers and other features:

<mvc:annotation-driven />

Solution 4

I think you are missing

<context:annotation-config />

Also make sure that your ConfigService class has

@Service("configService") 

Annotation, it will make this class candidate for autowiring.

and of cause you should use

<context:component-scan base-package="package" />

for the ConfigService package name.

Share:
29,745
Sagar
Author by

Sagar

I am fresher in technology world. Loves cricket and movies. Interested in Spring and java. Entering into Android world.

Updated on April 19, 2020

Comments

  • Sagar
    Sagar about 4 years

    following is my class:

    package com.abc.trade.util;
    
    public class StockTraderLogger {
    
        static Logger logger = Logger.getLogger("StockTraderLogger");
    
        @Autowired
        ConfigService configService; 
    
    
    
    
        public static void debug(Object className, Object logMessage) {     
            try {
                System.out.println("in debug.. ");
                StockTraderLogger stl =new StockTraderLogger();
                stl.addMessage(""+convertToString(className)+"\t"+convertToString(logMessage));
                System.out.println("in debug..post ");
            } catch (DataAccessException e) {
                System.out.println("Caught exception...");
                    e.printStackTrace();
            }
        }
    
        public void addMessage(String message) throws DataAccessException {
            System.out.println("in  add message of util. ");
            System.out.println("String: " + configService); 
    
            configService.addMessage(message);          
        }
    }
    

    @Autowire annotation is not working. It is displaying value of configService as null when called addMessage method. however it is properly injected in some of my Controller classes but not here.

    Can anyone explain what is problem? and how to resolve this issue?

    Code for XML is:(beansdefinition.xml)

       <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:aop="http://www.springframework.org/schema/aop"
               xmlns:tx="http://www.springframework.org/schema/tx"
               xmlns:context="http://www.springframework.org/schema/context"
               xsi:schemaLocation="
               http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
               http://www.springframework.org/schema/tx
               http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
               http://www.springframework.org/schema/aop
    
    
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    
        <context:component-scan base-package="com.abc.trade.util"/> 
          <context:component-scan base-package="com.abc.trade.service"/>
    
           <!-- Hibernate Configuration -->
           <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">    
    
                    <property name="annotatedClasses">      
                        <list>
              <value>com.abc.trade.model.Order</value>  
              <value>com.abc.trade.model.Profile</value> 
              <value>com.abc.trade.model.Log</value>                
                        </list>    
                    </property>  
               </bean>
    
                <tx:annotation-driven/> 
    
               <bean id="transactionManager" 
                   class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                    <property name="sessionFactory" ref="sessionFactory"/>
              </bean>
    
               <bean id="commonService" class="com.abc.trade.framework.service.CommonServiceImplementor">
                    <property name="commonDao" ref="commonDao"/>
               </bean>
    
               <bean id="commonDao" class="com.abc.trade.framework.dao.HibernateDAO">
                <property name="sessionFactory"><ref local="sessionFactory"/></property>
    
               </bean>
    
                <bean id="configService" class="com.abc.trade.service.ConfigServiceImplementor" parent="commonService">
               </bean>
    
               <import resource="../context/springws-servlet.xml"/>
         </beans>
    

    Another XML is:(Springmvc-servlet.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:webflow="http://www.springframework.org/schema/webflow-config"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/webflow-config
            http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">
    
       <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
           <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
            <property name="prefix" value="/jsp/"/>
             <property name="suffix" value=".jsp"/>
        </bean>
    
    
         <context:component-scan base-package="com.abc.trade.controller" />   
         <context:component-scan base-package="com.abc.trade.util"/>
    
    
         <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basename" value="messages" />
        </bean>
    
         <!-- Exception Resolver -->
         <bean id="exceptionResolver"
        class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
            <property name="exceptionMappings">
                <props>
                    <prop key="com.abc.trade.framework.exception.DataAccessException">
                    errorPage</prop>
                    <prop key="java.sql.SQLException">errorPage</prop>
                    <prop key="java.lang.Exception">errorPage</prop> 
                </props>
            </property>
        </bean>   
    
    </beans>
    

    Thank you in advance.

    ConfigService:

    package com.abc.trade.service;
    import org.springframework.stereotype.Service;
    import com.abc.trade.framework.exception.DataAccessException;
    
    public interface ConfigService {
    
            public void addMessage(String message) throws DataAccessException;
    }
    

    Config Service Implementor:

    package com.abc.trade.service;
    
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.abc.trade.framework.exception.DataAccessException;
    import com.abc.trade.framework.service.CommonServiceImplementor;
    import com.abc.trade.model.Log;
    import com.abc.trade.model.Mode;
    import com.abc.trade.util.StockTraderLogger;
    
    @Service("configService")
    public class ConfigServiceImplementor extends CommonServiceImplementor implements ConfigService{
    
        String errorMessage = "";
    
        @Override
        public void addMessage(String message) {
            System.out.println("in add message of service...........");
            Log log = new Log();
            try{
                log.setMessage(message);
                System.out.println("Message is: "+message);
                int i=save(log);
            }catch(Exception e)
            {
                errorMessage = "Error in saving debug message";
                e.printStackTrace();
                //throw new DataAccessException(errorMessage);
            }
    
        }
    
    }
    
    • DwB
      DwB about 13 years
      What is the full package class name of the ConfigService class? I think default injection is by type, not by name.
    • Sagar
      Sagar about 13 years
      I autowired this bean in controller and it is working fine but if I autowired in some other classes then it is not getting autowired.
    • Anuj Patel
      Anuj Patel about 12 years
      Did u happen to solve the problem sagar????
    • Sagar
      Sagar about 12 years
      @indyaah : No, Currently I'm not working on Spring.
  • Sagar
    Sagar about 13 years
    component scan is there in my XML, you can see that in XML code I shared in question itself. do I need to change it?
  • danny.lesnik
    danny.lesnik about 13 years
    you need to changeor add new one which refers to configService package
  • Sagar
    Sagar about 13 years
    you can check beansdefinition.xml, in that I added component scan which refers to service package. But same output.
  • danny.lesnik
    danny.lesnik about 13 years
    Could you please post ConfigService code and it's interface code?
  • Akash5288
    Akash5288 about 10 years
    I also tried this in my application, not working thats a serious issue. Lets close it as possible.
  • Akash5288
    Akash5288 about 10 years
    Does anybody has a proper solution for it. i also tried but not working. Lets close it as possible..
  • Prasad
    Prasad about 10 years
    @akash746 check my answer for this issue.