java - Spring+Hibernate. Error creating bean. Unsatisfied dependency. Cannot figure out what annotation is not right -
i've gone through every post on topic still can't find what's wrong. when try run server exception:
org.springframework.beans.factory.unsatisfieddependencyexception: error creating bean name 'administratordao': unsatisfied dependency expressed through method 'setdao' parameter 0: no qualifying bean of type [com.project.dataaccesslayer.dataaccessobject] found dependency [com.project.dataaccesslayer.dataaccessobject]: expected @ least 1 bean qualifies autowire candidate dependency. dependency annotations: {}; nested exception org.springframework.beans.factory.nosuchbeandefinitionexception: no qualifying bean of type [com.project.dataaccesslayer.dataaccessobject] found dependency [com.project.dataaccesslayer.dataaccessobject]: expected @ least 1 bean qualifies autowire candidate dependency. dependency annotations: {}
it says have no bean dataaccessobject if it's annotated @repository or defined in servlet-context.xml
i have customerdao , administratordao extends customerdao. i'll post customer part think if can make work, administrator part follow.
dataaccessobject class package com.project.dataaccesslayer; import java.util.list; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.criterion.restrictions; import org.springframework.beans.factory.annotation.autowired; import org.springframework.beans.factory.annotation.qualifier; import org.springframework.stereotype.repository; import com.project.model.account; import com.project.model.modelentity; import com.project.model.product; @repository("dao") public class dataaccessobject { private sessionfactory sessionfactory; private session session; @autowired @qualifier("sessionfactory") public void setsessionfactory(sessionfactory sessionfactory) { this.sessionfactory = sessionfactory; } public modelentity save(modelentity modelentity) { integer id = null; try { session = sessionfactory.opensession(); session.begintransaction(); id = (integer) session.save(modelentity); if (id != null) { modelentity.setid(id); } session.gettransaction().commit(); session.close(); } catch (exception e) { this.update(modelentity); } return modelentity; } public void update(modelentity modelentity) { try { session = sessionfactory.opensession(); session.begintransaction(); session.update(modelentity); session.gettransaction().commit(); } catch (exception e) { e.printstacktrace(); } { session.close(); } } @suppresswarnings("unchecked") public list<product> getproducts() { list<product> list = null; try { session = sessionfactory.opensession(); session.begintransaction(); list = session.createcriteria(product.class).list(); session.gettransaction().commit(); } catch (exception e) { e.printstacktrace(); } { session.close(); } return list; } @suppresswarnings("unchecked") public list<account> getaccounts() { list<account> list = null; try { session = sessionfactory.opensession(); session.begintransaction(); list = session.createcriteria(account.class).list(); session.gettransaction().commit(); } catch (exception e) { e.printstacktrace(); } { session.close(); } return list; } @suppresswarnings("unchecked") public list<product> getproductbyname(string brand, string model) { list<product> list = null; try { session = sessionfactory.opensession(); session.begintransaction(); list = session.createcriteria(product.class).add(restrictions.eq("brand", brand)) .add(restrictions.eq("model", model)).list(); session.gettransaction().commit(); } catch (exception e) { e.printstacktrace(); } { session.close(); } return list; } @suppresswarnings("unchecked") public list<account> getaccountbyusername(string username) { list<account> list = null; try { session = sessionfactory.opensession(); session.begintransaction(); list = session.createcriteria(account.class).add(restrictions.eq("username", username)).list(); session.gettransaction().commit(); } catch (exception e) { e.printstacktrace(); } { session.close(); } return list; } public void delete(modelentity modelentity) { try { session = sessionfactory.opensession(); session.begintransaction(); session.delete(modelentity); session.gettransaction().commit(); session.clear(); } catch (exception e) { e.printstacktrace(); } { session.close(); } } public sessionfactory getsessionfactory() { return sessionfactory; } }
customerdao class
package com.project.dataaccesslayer; import java.util.list; import org.springframework.beans.factory.annotation.autowired; import org.springframework.beans.factory.annotation.qualifier; import org.springframework.stereotype.repository; import com.project.model.account; import com.project.model.permission; import com.project.model.product; @repository("customerdao") public class customerdao implements icustomerdao { dataaccessobject dao; @autowired @qualifier("custdao") public void setdao(dataaccessobject dao) { this.dao = dao; } public dataaccessobject getdao() { return dao; } public account signup(string fullname, string username, string password, string email, string address, permission permission) throws exception { list<account> allaccounts = dao.getaccounts(); (account : allaccounts) { if (it.getusername().equals(username)) { throw new exception("the username exists"); } } account newaccount = new account(fullname, username, password, email, address, permission); account savedaccount = (account) dao.save(newaccount); return savedaccount; } public int login(string username, string password) throws exception { list<account> allaccounts = dao.getaccounts(); (account : allaccounts) { if (it.getusername().equals(username)) { { if (it.getpassword().equals(password)) { if (it.isonline() == false) { it.setonline(true); dao.update(it); return 200; } else { throw new exception("you logged in"); } } else { throw new exception("invalid password"); } } } } // username not found in database return 404; } public int logout(int accountid) throws exception { list<account> allaccounts = dao.getaccounts(); (account : allaccounts) { if (it.getid() == accountid) { { if (it.isonline()) { it.setonline(false); dao.update(it); return 200; } else { throw new exception("you not logged in"); } } } } return 400; } public account changepassword(string username, string oldpassword, string newpassword) throws exception { list<account> allaccounts = dao.getaccounts(); (account : allaccounts) { if (it.getusername().equals(username)) { { if (it.getpassword().equals(oldpassword)) { if (it.isonline()) { it.setpassword(newpassword); dao.update(it); return it; } else { throw new exception("you must logged in in order change password"); } } else { throw new exception("invalid password"); } } } } return null; } public list<product> showallproducts() { return dao.getproducts(); } public list<product> getproductbyname(string brand, string model) { return dao.getproductbyname(brand, model); } }
customerservice class
package com.project.services; import java.util.list; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.service; import org.springframework.transaction.annotation.transactional; import com.project.dataaccesslayer.customerdao; import com.project.model.account; import com.project.model.permission; import com.project.model.product; @service("customerservice") @transactional public class customerservice implements icustomerservice { private customerdao cdao; public customerdao getcdao() { return cdao; } @autowired public void setcdao(customerdao cdao) { this.cdao = cdao; } @transactional public account signup(string fullname, string username, string password, string email, string address, permission permission) throws exception { if (username.equals("") || password.length() < 3 || permission == null) { throw new exception("you must provide username , minimum 3 character long password"); } else { return cdao.signup(fullname, username, password, email, address, permission); } } @transactional public boolean login(string username, string password) throws exception { if (cdao.login(username, password) == 200) return true; return false; } @transactional public boolean logout(int accountid) throws exception { if (cdao.logout(accountid) == 200) return true; return false; } @transactional public account changepassword(string username, string oldpassword, string newpassword) throws exception { if (newpassword.length() < 3) { throw new exception("password must have minimum 3 characters"); } return cdao.changepassword(username, oldpassword, newpassword); } @transactional public list<product> showallproducts() { return cdao.showallproducts(); } @transactional public product getproductbyname(string brand, string model) throws exception { list<product> plist = cdao.getproductbyname(brand, model); if (plist.isempty()) { throw new exception(brand + " " + model + " not exist"); } else { return plist.get(0); } } }
customercontroller class
package com.project.controller; import java.util.list; import org.springframework.beans.factory.annotation.autowired; import org.springframework.beans.factory.annotation.qualifier; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.modelattribute; import org.springframework.web.bind.annotation.pathvariable; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.servlet.modelandview; import com.project.model.account; import com.project.model.product; import com.project.services.customerservice; import com.project.services.icustomerservice; @controller("customercontroller") @requestmapping("/") public class customercontroller { icustomerservice customerservice; @autowired(required = true) @qualifier(value="customerservice") public void setcustomerservice(customerservice cs){ this.customerservice = cs; } @requestmapping(value = "/account", method = requestmethod.get) public modelandview showform() { return new modelandview("account", "account", new account()); } @requestmapping(value = "/signup", method = requestmethod.post) public string signup(@modelattribute("account") account acc) throws exception { this.customerservice.signup(acc.getfullname(), acc.getusername(), acc.getpassword(), acc.getemail(), acc.getaddress(), acc.getpermission()); return "redirect:/login"; } @requestmapping(value = "/login", method = requestmethod.post) public string login(@modelattribute("account") account acc) throws exception { this.customerservice.login(acc.getusername(), acc.getpassword()); return "redirect:/products"; } @requestmapping(value = "/logout", method = requestmethod.post) public string logout(@modelattribute("account") account acc) throws exception { this.customerservice.logout(acc.getid()); return "redirect:/login"; } @requestmapping(value="/changepassword/{newpassword}", method = requestmethod.post) public string changepassword(@modelattribute("account") account acc, @pathvariable("newpassword") string newpassword) throws exception { this.customerservice.changepassword(acc.getusername(), acc.getpassword(), newpassword); return "redirect:/login"; } @requestmapping(value = "/products", method = requestmethod.get) public modelandview showproducts() { list<product> productlist = this.customerservice.showallproducts(); return new modelandview("products", "productlist", productlist); } }
web.xml
<....>`` <context-param> <param-name>contextconfiglocation</param-name> <param-value>/web-inf/root-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.contextloaderlistener</listener-class> </listener> <servlet> <servlet-name>appservlet</servlet-name> <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class> <init-param> <param-name>contextconfiglocation</param-name> <param-value>/web-inf/appservlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appservlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
root-context.xml (empty)
<?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:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans>
servlet-context.xml
<?xml ...."> <beans:bean class="org.springframework.web.servlet.view.internalresourceviewresolver"> <beans:property name="prefix" value="/web-inf/jsp/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean> <context:component-scan base-package="com.project" /> <!-- enables spring mvc @controller programming model --> <annotation-driven /> <!-- handles http requests /resources/** efficiently serving static resources in ${webapproot}/resources directory --> <resources mapping="/resources/**" location="/resources/" /> <beans:bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <beans:property name="driverclassname" value="com.mysql.jdbc.driver" /> <beans:property name="url" value="jdbc:mysql://localhost:3306/guitarshop" /> <beans:property name="username" value="root" /> <beans:property name="password" value="" /> </beans:bean> <beans:bean id="sessionfactory" class="org.springframework.orm.hibernate3.annotation.annotationsessionfactorybean"> <beans:property name="annotatedclasses"> <beans:list> <beans:value>com.project.model.account</beans:value> <beans:value>com.project.model.product</beans:value> </beans:list> </beans:property> <beans:property name="hibernateproperties"> <beans:props> <beans:prop key="hibernate.dialect">org.hibernate.dialect.mysqldialect </beans:prop> <beans:prop key="hibernate.show_sql">true</beans:prop> <beans:prop key="hibernate.enable_lazy_load_no_trans">true</beans:prop> </beans:props> </beans:property> </beans:bean> <!-- <beans:bean id="dao" --> <!-- class="com.project.dataaccesslayer.dataaccessobject"> --> <!-- <beans:property name="sessionfactory" ref="sessionfactory" /> --> <!-- </beans:bean> --> <!-- <beans:bean id="customerdao" class="com.project.dataaccesslayer.customerdao"> --> <!-- <beans:property name="dao" ref="dao" /> --> <!-- </beans:bean> --> <!-- <beans:bean id="administratordao" --> <!-- class="com.project.dataaccesslayer.administratordao"> --> <!-- <beans:property name="dao" ref="dao" /> --> <!-- </beans:bean> --> <!-- <beans:bean id="customerservice" class="com.project.services.customerservice"> --> <!-- <beans:property name="customerdao" ref="customerdao"></beans:property> --> <!-- </beans:bean> --> <!-- <beans:bean id="administratorservice" class="com.project.services.administratorservice"> --> <!-- <beans:property name="administratordao" ref="administratordao"></beans:property> --> <!-- </beans:bean> --> <tx:annotation-driven transaction-manager="transactionmanager" /> <beans:bean id="transactionmanager" class="org.springframework.orm.hibernate3.hibernatetransactionmanager"> <beans:property name="sessionfactory" ref="sessionfactory" /> </beans:bean> </beans:beans>
i commented dao , service beans because understood @repository, @component , @service annotations create beans.
i have use dataaccessobject in both customerdao , administratordao.
you expecting dependency dataaccessobject
bean @qualifier("custdao")
inside customerdao
, there no dataaccessobject
beans available @qualifier("custdao")
in other words, issue because of @qualifier("custdao")
i.e., spring
container not inject dataaccessobject
bean customerdao
(as there no beans available expected @qualifier
), need change dataaccessobject
shown below:
@repository @qualifier("custdao") public class dataaccessobject { //current code }
you can here more on @qualifier
Comments
Post a Comment