java - Spring bean creation is failing for beans without an "id" attribute -
i have spring controller definition follows :
@controller @requestmapping("/queue") public class queuecontroller { queuesservice queueservice; public queuecontroller(queuesservice queueservice) { if (queueservice == null) { throw new illegalargumentexception("queueservice cannot null"); } this.queueservice = queueservice; } } and corresponding entry in context-configuration file follows (where bean definition not have "id" attribute):
<bean class="com.xy.web.controllers.queuecontroller"> <constructor-arg ref="queueserviceimpl"></constructor-arg> </bean> now,during application startup, spring throwing below exception:
caused by: org.springframework.beans.beaninstantiationexception: not instantiate bean class [com.xy.web.controllers.queuecontroller]: no default constructor found; nested exception java.lang.nosuchmethodexception: com.xy.web.controllers.queuecontroller.<init>() however when add "id" attribute "bean definition" (as follows), getting created properly.
<bean id="queuecontroller" class="com.xy.web.controllers.queuecontroller"> <constructor-arg ref="queueserviceimpl"></constructor-arg> </bean> any explanation or missing here?
i'm going assume have <content:component-scan ...> in config somewhere. try instantiate @component annotated classes. @controller @component spring try instantiate queuecontroller using class default empty constructor. in case, such constructor doesn't exist. therefore throw exception seeing.
you need add empty constructor
public queuecontroller() {} this happens regardless of bean declaration
<bean class="com.xy.web.controllers.queuecontroller"> <constructor-arg ref="queueserviceimpl"></constructor-arg> </bean> you're going end 2 queuecontroller instances. might not want.
as behavior you're seeing because of id:
when application context reads component-scan register beancomponentdefinition name queuecontroller. context moves on bean declaration. because you've specified id equal previous definition, override it. end 1 bean definition queuecontroller class. since bean declaration requires constructor specific argument , have that, won't complain , create bean.
if specified different id, abcd, application context register 2 beandefinitions: 1 name queuecontroller (following default name generation strategy) component-scan , 1 name abcd <bean> declaration. queuecontroller requires default constructor don't have. therefore exception.
more detailed
if using classpathxmlapplicationcontext, take @ classpathbeandefinitionscanner#doscan(string...) method's following call
string beanname = this.beannamegenerator.generatebeanname(candidate, this.registry); the beannamegenerator instance of annotationbeannamegenerator. calls
// fallback: generate unique default bean name. return builddefaultbeanname(definition, registry); which calls
string shortclassname = classutils.getshortname(definition.getbeanclassname()); return introspector.decapitalize(shortclassname); to return default name queuecontroller. that's 1 you're id overrides.
you can see in logs:
mon aug 26 12:12:15 edt 2013 [main] info o.s.b.f.s.defaultlistablebeanfactory - overriding bean definition bean 'queuecontroller': replacing [generic bean: class [org.test.queuecontroller]; scope=singleton; abstract=false; lazyinit=false; autowiremode=0; dependencycheck=0; autowirecandidate=true; primary=false; factorybeanname=null; factorymethodname=null; initmethodname=null; destroymethodname=null; defined in file [c:\users\sotirios.delimanolis\git\content-store\target\test-classes\org\test\queuecontroller.class]] [generic bean: class [org.test.queuecontroller]; scope=; abstract=false; lazyinit=false; autowiremode=0; dependencycheck=0; autowirecandidate=true; primary=false; factorybeanname=null; factorymethodname=null; initmethodname=null; destroymethodname=null; defined in class path resource [app.xml]]
Comments
Post a Comment