2012-02-15 15 views
12

Mam problemy z moim kontrolerów Spring - Dostaję konstruktor domyślny nie znaleziono - ale mają konstruktora który próbuję stworzony przez applicationContext.xml - Herezje istotnych bitów:Spring MVC nie znaleziono konstruktora domyślnego?

<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> 

Tzn. Najpierw tworzę komponent bean, a następnie próbuję przekazać wynik wywołania metody z tego komponentu bean do konstruktora komponentu drugiego komponentu bean (CacheHandler).

Here'e początek CacheHandler:

@Controller 
    public class CacheHandler { 

    private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

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

Oto błąd Dostaję:

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>() 

Każda pomoc jest mile widziane!

Odpowiedz

20

Powinieneś zdefiniować swoje fasolki w xml lub opisać je, a nie obie (jeśli chcesz uniknąć błędów takich jak ten, który otrzymujesz).

Problem polega na tym, że nie tworzysz argumentów konstruktora, więc wiosna nie wie, co zrobić ze sterownikiem. Wie, że musi utworzyć komponent bean (@Controller adnotacja), ale nie wie, w jaki sposób (bez domyślnego, ani autowyred konstruktora).

Można spróbować zrobić coś takiego:

@Controller 
public class CacheHandler { 

private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

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

a następnie w xml:

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

Tak będzie autowire parametry konstruktora.

Inną opcją jest po prostu utworzyć domyślną właściwość konstruktora i autowire gxSessionIdCache.

+0

dzielimy ten sam pomysł ;-) –

+0

wielki, dzięki za odpowiedzi wszystkich! – Rory

+1

Świetnie to potwierdzić, potrzebuję albo konstruktora domyślnego, albo konstruktora przewodowego. – lwpro2

2

Trzeba dodać pustego konstruktora domyślnego:

@Controller 
    public class CacheHandler { 

    private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

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

Ale należy zachować ostrożność, ponieważ wydaje się, że jesteś mieszanie konfigurację opartą adnotacji (@Controller) i konfiguracji XML. W powyższym przykładzie używa konfiguracji opartej na adnotacjach (więc usuń deklarację bean z pliku XML).

+1

Dlaczego domyślny konstruktor? To nie jest obowiązkowe, prawda? – kosa

+0

Właśnie edytowałem swój post. –

+0

[Czy Spring wymaga, aby wszystkie komponenty bean miały domyślny konstruktor?] (Http://stackoverflow.com/questions/7492652/does-spring-require-all-beans-to-have-a-default-constructor): [* * nie **] (http://stackoverflow.com/a/7492713/545127) – Raedwald

0

Ten błąd można również uzyskać, jeśli nie aktywowano konfiguracji opartej na adnotacjach Spring. Uwzględnienie tego w swoim wiosennym xml:

< kontekstu: adnotacji-config/>

0

Inne plakaty zwracają uwagę, że możesz mieć problemy, jeśli wymieszać autowiring/Component-skanowanie z wyraźnej instancji fasoli. Miałem podobny problem z aplikacją internetową, która to zrobiła. Udało mi się rozwiązać problem, mówiąc, że skaner składników nie automatycznie tworzy komponent fasoli klasy kluczowej. Tak:

<?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> 

gdzie repository.xml obejmowały wyraźny fasoli konkretyzacji:

<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> 
Powiązane problemy