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
Post a Comment