2012-02-15 13 views
12

Sto avendo problemi con i miei regolatori di primavera - che sto ricevendo nessun costruttore di default trovato - ma hanno un costruttore che sto cercando di creato tramite l'applicationContext.xml - Heres il bit rilevanti:Spring MVC non trovato costruttore predefinito?

<bean id="PcrfSimulator" class="com.rory.services.pcrf.simulator.PcrfSimulator" init-method="start"> 
</bean> 

<bean id="CacheHandler" class="com.rory.services.pcrf.simulator.handlers.CacheHandler"> 
    <constructor-arg index="0" type="com.rory.services.pcrf.simulator.CustomGxSessionIdCacheImpl"> 
     <bean factory-bean="PcrfSimulator" factory-method="getGxSessionIdCache"> 
     </bean> 
    </constructor-arg>  
</bean> 

Ie. Sto creando un bean prima e poi provando a passare il risultato di una chiamata di metodo da quel bean al costruttore del secondo bean (CacheHandler).

Here'e l'inizio di CacheHandler:

@Controller 
    public class CacheHandler { 

    private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

    public CacheHandler(CustomGxSessionIdCacheImpl gxSessionIdCache) { 
     this.gxSessionIdCache = gxSessionIdCache; 
    } 

Ecco l'errore che sto ricevendo:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheHandler' defined in URL [jar:file:/users/rtorney/Documents/apache-tomcat-7.0.25/webapps/PCRFSimulator-4.0/WEB-INF/lib/PCRFSimulator-4.0.jar!/com/rory/services/pcrf/simulator/handlers/CacheHandler.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.rory.services.pcrf.simulator.handlers.CacheHandler]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.rory.services.pcrf.simulator.handlers.CacheHandler.<init>() 

Ogni aiuto è molto apprezzato!

risposta

20

È necessario definire i bean in xml o annotarli, non entrambi (se non altro per evitare errori come quello che si ottiene).

Il problema qui è che non si stanno automatizzando le discussioni del costruttore, quindi spring non sa cosa fare con il controller. Sa che deve creare un bean (annotazione @Controller), ma non sa come (nessun costruttore predefinito, né autowired).

Si può provare a fare qualcosa di simile:

@Controller 
public class CacheHandler { 

private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

@Autowired 
public CacheHandler(CustomGxSessionIdCacheImpl gxSessionIdCache) { 
    this.gxSessionIdCache = gxSessionIdCache; 
} 

e poi in xml:

<bean id="gxSessionIdCache" 
    factory-bean="PcrfSimulator" 
    factory-method="getGxSessionIdCache"/> 

ti autowire parametri del costruttore.

Un'altra opzione è semplicemente creare la proprietà predefinita costruttore e autowire gxSessionIdCache.

+0

condividiamo la stessa idea ;-) –

+0

Grandi, grazie per tutte le risposte! – Rory

+1

ottimo per confermare questo, la primavera ha bisogno di costruttore predefinito, o costruttore di cavi automatico. – lwpro2

2

si deve aggiungere un costruttore di default vuoto:

@Controller 
    public class CacheHandler { 

    private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

    @Autowired 
    public CacheHandler(CustomGxSessionIdCacheImpl gxSessionIdCache) { 
     this.gxSessionIdCache = gxSessionIdCache; 
    } 

Ma fate attenzione, perché sembra che si stia mescolando configurazione di annotazione base (@Controller) e di configurazione XML. Nell'esempio sopra, usa la configurazione basata sull'annotazione (quindi rimuovi la dichiarazione del bean dal tuo file XML).

+1

Perché costruttore predefinito? Non è obbligatorio vero? – kosa

+0

Ho appena modificato il mio post. –

+0

[Spring richiede che tutti i bean abbiano un costruttore predefinito?] (Http://stackoverflow.com/questions/7492652/does-spring-require-all-beans-to-have-a-default-constructor): [* * non **] (http://stackoverflow.com/a/7492713/545127) – Raedwald

0

È anche possibile ottenere questo errore se non è stata attivata la configurazione basata su annotazione di Spring. Includere questo nella vostra primavera Xml:

< context: annotation-config/>

0

altri utenti hanno fatto notare che è possibile ottenere i problemi se si mescolano autowiring/Component-scansione con istanziazione esplicita di fagioli. Ho avuto un problema simile con un'applicazione web che lo ha fatto. Sono stato in grado di risolvere il problema dicendo al componente-scanner di non istanziare automaticamente un bean della classe cruciale. Come questo:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns=...> 

    <aop:aspectj-autoproxy /> 

    <import resource="repository.xml" /> 
    ... 

    <context:component-scan base-package="com.example.webserver"> 
     <context:exclude-filter type="regex" expression="MyRepositoryImpl" /> 
     <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" /> 
    </context:component-scan> 
</beans> 

dove repository.xml inclusa la creazione di istanze di fagioli esplicito:

<beans xmlns=...> 
    <bean id="password" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:/comp/env/store/clientPassword" /> 
    </bean> 
    <bean id="repository" class="com.example.webserver.datalayer.MyRepositoryImpl"> 
     <constructor-arg ref="password" /> 
    </bean> 
... 
</beans> 
Problemi correlati