java - DataSource not getting injected in Spring 3 -


i'm new spring, please bear me.

i tried configuring app using annotations , java. however, data source not getting injected dao impl.

i have properties file maintains 3 different configs(dev,uat,prd) , these accessed via commonconfig.

i getting below error-

initialization of bean failed; nested exception org.springframework.beans.factory.beaninitializationexception: property 'datasource' required bean 'jdbcclientfunddao' 

dao-

package com.globeop.goreporting.gonavpack.persistence.dao;  import java.util.arraylist; import java.util.list;  public interface clientfunddao {      public list<string> getclientsforuser(string user);      public arraylist<string> getfundsforclient(string client);  } 

dao implementer-

package com.globeop.goreporting.gonavpack.persistence.dao.impl;  import java.util.arraylist; import java.util.collections; import java.util.list;  import javax.sql.datasource;  import org.springframework.beans.factory.annotation.required; import org.springframework.jdbc.core.jdbctemplate; import org.springframework.stereotype.repository; import com.globeop.goreporting.gonavpack.persistence.dao.clientfunddao;  @repository public class jdbcclientfunddao implements clientfunddao {      private jdbctemplate jdbctemplate;      @required    // tried @autowired     public void setdatasource(datasource datasource) {         this.jdbctemplate = new jdbctemplate(datasource);     }      public list<string> getclientsforuser(string user) {         list<string> clients = jdbctemplate.queryforlist("select distinct clientshortname client isactiveflag = ?", string.class, 1);         return clients;     }      public arraylist<string> getfundsforclient(string client) {         // todo auto-generated method stub         return null;     } } 

datascource-

package com.globeop.goreporting.gonavpack.persistence.datasource;  import org.apache.tomcat.dbcp.dbcp.basicdatasource; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration;  import com.globeop.goreporting.gonavpack.model.commonconfig;  @configuration public class datasourceforclientfund {      private static final string driverclassname = commonconfig.db_parametermap_driver;     private static final string url = commonconfig.db_parametermap_url;     private static final string dbusername = commonconfig.db_parametermap_user;     private static final string dbpassword = commonconfig.db_parametermap_pwd;      @bean     public static basicdatasource getdatasource() {         basicdatasource datasource = new basicdatasource();         datasource.setdriverclassname(driverclassname);         datasource.seturl(url);         datasource.setusername(dbusername);         datasource.setpassword(dbpassword);         return datasource;     }  } 

webapplication context (navsummaryservlet-context.xml)-

<!-- contains @controller, @requestmapping, view resolver, etc  --> <context:component-scan base-package="com.globeop.goreporting.gonavpack.webconfigs" /> <mvc:annotation-driven /> 

application context (navsummaryapplication-context.xml)-

<!-- contains dao, dao impl, , datasource beans --> <context:annotation-config/> <context:component-scan base-package="com.globeop.goreporting.gonavpack.persistence" /> 

web.xml-

  <servlet>     <servlet-name>navsummaryservlet</servlet-name>     <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>     <init-param>       <param-name>contextconfiglocation</param-name>       <param-value>/web-inf/spring/gonavpackservlet/navsummaryservlet-context.xml</param-value>     </init-param>   </servlet>    <servlet-mapping>     <servlet-name>navsummaryservlet</servlet-name>     <url-pattern>/navsummary.jsp</url-pattern>   </servlet-mapping>    <context-param>     <param-name>contextconfiglocation</param-name>     <param-value>/web-inf/spring/gonavpackapp/navsummaryapplication-context.xml</param-value>   </context-param> 

you don't need initialize jdbctemplate in class. whole point of ioc container have you.

so add @bean method create it. (also, don't make methods static, it's not needed in case)

@configuration @componentscan(basepackages = "the.name.of.your.package") public class datasourceforclientfund {      private static final string driverclassname = commonconfig.db_parametermap_driver;     private static final string url = commonconfig.db_parametermap_url;     private static final string dbusername = commonconfig.db_parametermap_user;     private static final string dbpassword = commonconfig.db_parametermap_pwd;      @bean     public basicdatasource getdatasource() {         basicdatasource datasource = new basicdatasource();         datasource.setdriverclassname(driverclassname);         datasource.seturl(url);         datasource.setusername(dbusername);         datasource.setpassword(dbpassword);         return datasource;     }       @bean     public jdbctemplate jdbctemplate() {             final jdbctemplate jdbctemplate = new jdbctemplate();          jdbctemplate.setdatasource(getdatasource()); // notice calling other bean method         jdbctemplate.afterpropertiesset();          return jdbctemplate;     } } 

you can @autowired or @inject jdbctemplate directly.

in @repository

@repository public class jdbcclientfunddao implements clientfunddao {     @autowired     private jdbctemplate jdbctemplate;     ... } 

in @controller

@controller public class yourcontroller {     @autowired     private clientfunddao clientfunddao; // spring inject `jdbcclientfunddao` instance } 

this spring documentation should explain how these configurations done.


Comments

Popular posts from this blog

matlab - Deleting rows with specific rules -

jquery - How would i go about shortening this code? And to cancel the previous click on click of new section? -