@autowired annotation issue, not injecting bean in class, using Spring3.0, hibernate
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.
Sagar
I am fresher in technology world. Loves cricket and movies. Interested in Spring and java. Entering into Android world.
Updated on April 19, 2020Comments
-
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 ofconfigService
as null when calledaddMessage
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 about 13 yearsWhat is the full package class name of the ConfigService class? I think default injection is by type, not by name.
-
Sagar about 13 yearsI 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 about 12 yearsDid u happen to solve the problem sagar????
-
Sagar about 12 years@indyaah : No, Currently I'm not working on Spring.
-
-
Sagar about 13 yearscomponent 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 about 13 yearsyou need to changeor add new one which refers to configService package
-
Sagar about 13 yearsyou can check beansdefinition.xml, in that I added component scan which refers to service package. But same output.
-
danny.lesnik about 13 yearsCould you please post ConfigService code and it's interface code?
-
Akash5288 about 10 yearsI also tried this in my application, not working thats a serious issue. Lets close it as possible.
-
Akash5288 about 10 yearsDoes anybody has a proper solution for it. i also tried but not working. Lets close it as possible..
-
Prasad about 10 years@akash746 check my answer for this issue.