java - Cannot use Components/Service/Repository in Controller class -
i have configurated dao layer(i've created test check it), , integrate project spring mvc.
i've added configuration:
@configuration @enablewebmvc @componentscan(basepackages = "com.szymon.controller") public class webmvcconfig { @bean public viewresolver viewresolver() { internalresourceviewresolver viewresolver = new internalresourceviewresolver(); viewresolver.setviewclass(jstlview.class); viewresolver.setprefix("/web-inf/views/"); viewresolver.setsuffix(".jsp"); return viewresolver; } } public class webinitializer implements webapplicationinitializer { public void onstartup(servletcontext container) throws servletexception { annotationconfigwebapplicationcontext ctx = new annotationconfigwebapplicationcontext(); ctx.register(webmvcconfig.class); ctx.setservletcontext(container); servletregistration.dynamic servlet = container.addservlet("dispatcher", new dispatcherservlet(ctx)); servlet.setloadonstartup(1); servlet.addmapping("/"); } }
and controller looks like:
@controller public class helloworldcontroller { @autowired private meetingrepository meetingrepository; @requestmapping("/hello") public string helloworld(model model) { model.addattribute("message", "message"); model.addattribute("meeting", meetingrepository.findone(1l)); return "helloworld"; } @requestmapping("/hel") public string hel(model model) { model.addattribute("message", "message"); return "helloworld2"; }
}
after commenting meetingrepository field , helloworld() method servlet works fine. if not commented doesn't working:
javax.servlet.servletexception: servlet.init() servlet dispatcher threw exception org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:502) org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:79) org.apache.catalina.valves.abstractaccesslogvalve.invoke(abstractaccesslogvalve.java:616) org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:521) org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1096) org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:674) org.apache.tomcat.util.net.aprendpoint$socketprocessor.dorun(aprendpoint.java:2500) org.apache.tomcat.util.net.aprendpoint$socketprocessor.run(aprendpoint.java:2489) java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1142) java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:617) org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61) java.lang.thread.run(thread.java:745) root cause org.springframework.beans.factory.beancreationexception: error creating bean name 'helloworldcontroller': injection of autowired dependencies failed; nested exception org.springframework.beans.factory.beancreationexception: not autowire field: private com.szymon.repository.meetingrepository com.szymon.controller.helloworldcontroller.meetingrepository; nested exception org.springframework.beans.factory.nosuchbeandefinitionexception: no qualifying bean of type [com.szymon.repository.meetingrepository] found dependency: expected @ least 1 bean qualifies autowire candidate dependency. dependency annotations: {@org.springframework.beans.factory.annotation.autowired(required=true)} org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor.postprocesspropertyvalues(autowiredannotationbeanpostprocessor.java:334) org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.populatebean(abstractautowirecapablebeanfactory.java:1208) org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(abstractautowirecapablebeanfactory.java:537) org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(abstractautowirecapablebeanfactory.java:476) org.springframework.beans.factory.support.abstractbeanfactory$1.getobject(abstractbeanfactory.java:303) org.springframework.beans.factory.support.defaultsingletonbeanregistry.getsingleton(defaultsingletonbeanregistry.java:230) org.springframework.beans.factory.support.abstractbeanfactory.dogetbean(abstractbeanfactory.java:299) org.springframework.beans.factory.support.abstractbeanfactory.getbean(abstractbeanfactory.java:194) org.springframework.beans.factory.support.defaultlistablebeanfactory.preinstantiatesingletons(defaultlistablebeanfactory.java:755) org.springframework.context.support.abstractapplicationcontext.finishbeanfactoryinitialization(abstractapplicationcontext.java:762) org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:480) org.springframework.web.servlet.frameworkservlet.configureandrefreshwebapplicationcontext(frameworkservlet.java:664) org.springframework.web.servlet.frameworkservlet.initwebapplicationcontext(frameworkservlet.java:536) org.springframework.web.servlet.frameworkservlet.initservletbean(frameworkservlet.java:490) org.springframework.web.servlet.httpservletbean.init(httpservletbean.java:136) javax.servlet.genericservlet.init(genericservlet.java:158) org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:502) org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:79) org.apache.catalina.valves.abstractaccesslogvalve.invoke(abstractaccesslogvalve.java:616) org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:521) org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1096) org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:674) org.apache.tomcat.util.net.aprendpoint$socketprocessor.dorun(aprendpoint.java:2500) org.apache.tomcat.util.net.aprendpoint$socketprocessor.run(aprendpoint.java:2489) java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1142) java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:617) org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61) java.lang.thread.run(thread.java:745) root cause org.springframework.beans.factory.beancreationexception: not autowire field: private com.szymon.repository.meetingrepository com.szymon.controller.helloworldcontroller.meetingrepository; nested exception org.springframework.beans.factory.nosuchbeandefinitionexception: no qualifying bean of type [com.szymon.repository.meetingrepository] found dependency: expected @ least 1 bean qualifies autowire candidate dependency. dependency annotations: {@org.springframework.beans.factory.annotation.autowired(required=true)} org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor$autowiredfieldelement.inject(autowiredannotationbeanpostprocessor.java:561) org.springframework.beans.factory.annotation.injectionmetadata.inject(injectionmetadata.java:88) org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor.postprocesspropertyvalues(autowiredannotationbeanpostprocessor.java:331) org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.populatebean(abstractautowirecapablebeanfactory.java:1208) org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(abstractautowirecapablebeanfactory.java:537) org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(abstractautowirecapablebeanfactory.java:476) org.springframework.beans.factory.support.abstractbeanfactory$1.getobject(abstractbeanfactory.java:303) org.springframework.beans.factory.support.defaultsingletonbeanregistry.getsingleton(defaultsingletonbeanregistry.java:230) org.springframework.beans.factory.support.abstractbeanfactory.dogetbean(abstractbeanfactory.java:299) org.springframework.beans.factory.support.abstractbeanfactory.getbean(abstractbeanfactory.java:194) org.springframework.beans.factory.support.defaultlistablebeanfactory.preinstantiatesingletons(defaultlistablebeanfactory.java:755) org.springframework.context.support.abstractapplicationcontext.finishbeanfactoryinitialization(abstractapplicationcontext.java:762) org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:480) org.springframework.web.servlet.frameworkservlet.configureandrefreshwebapplicationcontext(frameworkservlet.java:664) org.springframework.web.servlet.frameworkservlet.initwebapplicationcontext(frameworkservlet.java:536) org.springframework.web.servlet.frameworkservlet.initservletbean(frameworkservlet.java:490) org.springframework.web.servlet.httpservletbean.init(httpservletbean.java:136) javax.servlet.genericservlet.init(genericservlet.java:158) org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:502) org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:79) org.apache.catalina.valves.abstractaccesslogvalve.invoke(abstractaccesslogvalve.java:616) org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:521) org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1096) org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:674) org.apache.tomcat.util.net.aprendpoint$socketprocessor.dorun(aprendpoint.java:2500) org.apache.tomcat.util.net.aprendpoint$socketprocessor.run(aprendpoint.java:2489) java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1142) java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:617) org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61) java.lang.thread.run(thread.java:745) root cause org.springframework.beans.factory.nosuchbeandefinitionexception: no qualifying bean of type [com.szymon.repository.meetingrepository] found dependency: expected @ least 1 bean qualifies autowire candidate dependency. dependency annotations: {@org.springframework.beans.factory.annotation.autowired(required=true)} org.springframework.beans.factory.support.defaultlistablebeanfactory.raisenosuchbeandefinitionexception(defaultlistablebeanfactory.java:1301) org.springframework.beans.factory.support.defaultlistablebeanfactory.doresolvedependency(defaultlistablebeanfactory.java:1047) org.springframework.beans.factory.support.defaultlistablebeanfactory.resolvedependency(defaultlistablebeanfactory.java:942) org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor$autowiredfieldelement.inject(autowiredannotationbeanpostprocessor.java:533) org.springframework.beans.factory.annotation.injectionmetadata.inject(injectionmetadata.java:88) org.springframework.beans.factory.annotation.autowiredannotationbeanpostprocessor.postprocesspropertyvalues(autowiredannotationbeanpostprocessor.java:331) org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.populatebean(abstractautowirecapablebeanfactory.java:1208) org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(abstractautowirecapablebeanfactory.java:537) org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(abstractautowirecapablebeanfactory.java:476) org.springframework.beans.factory.support.abstractbeanfactory$1.getobject(abstractbeanfactory.java:303) org.springframework.beans.factory.support.defaultsingletonbeanregistry.getsingleton(defaultsingletonbeanregistry.java:230) org.springframework.beans.factory.support.abstractbeanfactory.dogetbean(abstractbeanfactory.java:299) org.springframework.beans.factory.support.abstractbeanfactory.getbean(abstractbeanfactory.java:194) org.springframework.beans.factory.support.defaultlistablebeanfactory.preinstantiatesingletons(defaultlistablebeanfactory.java:755) org.springframework.context.support.abstractapplicationcontext.finishbeanfactoryinitialization(abstractapplicationcontext.java:762) org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:480) org.springframework.web.servlet.frameworkservlet.configureandrefreshwebapplicationcontext(frameworkservlet.java:664) org.springframework.web.servlet.frameworkservlet.initwebapplicationcontext(frameworkservlet.java:536) org.springframework.web.servlet.frameworkservlet.initservletbean(frameworkservlet.java:490) org.springframework.web.servlet.httpservletbean.init(httpservletbean.java:136) javax.servlet.genericservlet.init(genericservlet.java:158) org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:502) org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:79) org.apache.catalina.valves.abstractaccesslogvalve.invoke(abstractaccesslogvalve.java:616) org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:521) org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1096) org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:674) org.apache.tomcat.util.net.aprendpoint$socketprocessor.dorun(aprendpoint.java:2500) org.apache.tomcat.util.net.aprendpoint$socketprocessor.run(aprendpoint.java:2489) java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1142) java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:617) org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61) java.lang.thread.run(thread.java:745)
it looks, spring not making beans when using spring mvc. how should configure application working properly?
edit meetingrepository class:
public interface meetingrepository extends jparepository<meeting, long> { } @configuration @enablejparepositories(basepackages = "com.szymon.repository") @enabletransactionmanagement public class dataaccessconfig { @bean public localentitymanagerfactorybean entitymanagerfactory() { localentitymanagerfactorybean localentitymanagerfactorybean = new localentitymanagerfactorybean(); localentitymanagerfactorybean.setpersistenceunitname("postgres"); return localentitymanagerfactorybean; } @bean public jpatransactionmanager transactionmanager(entitymanagerfactory entitymanagerfactory) { jpatransactionmanager jpatransactionmanager = new jpatransactionmanager(); jpatransactionmanager.setentitymanagerfactory(entitymanagerfactory); return jpatransactionmanager; } }
it's working well, because i've tested it:
@runwith(springjunit4classrunner.class) @contextconfiguration(classes = dataaccessconfig.class) public class meetingrepositorytest { @autowired private meetingrepository meetingrepository; @test public void test() { meeting meeting = new meeting(); meeting.setaddeddate(new date()); meeting.setmeetingdate(new date(system.currenttimemillis() + 604800000)); meeting.setnotes("moje pierwsze spotkanie."); meeting.setplace("pokoj 200"); meetingrepository.save(meeting); assert.asserttrue(true); } }
try placing @enabletransactionmanagement
, @enablejparepositories(basepackages=...)
on webmvcconfig.java
class , place @repository
on meetingrepository class
.
although dataaccessconfig
class marked @configuration
not being referenced in webinitializer
class. webinitializer
class referencing webmvcconfig
, considered.
if want can specify dataaccessconfig
along webmvcconfig
using ctx.register(webmvcconfig.class, dataaccessconfig.class);
. should work well.
Comments
Post a Comment