2012-02-15 1 views
12

У меня возникли проблемы с моими пружиной контроллеров - я получаю конструктора по умолчанию не нашел - но у них есть конструктор, который я пытаюсь создано с помощью applicationContext.xml - Херес соответствующих бит:Spring MVC не найден конструктор по умолчанию?

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

Т.е. Сначала я создаю компонент, а затем пытаюсь передать результат вызова метода из этого компонента в конструктор второго компонента (CacheHandler).

Here'e начало CacheHandler:

@Controller 
    public class CacheHandler { 

    private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

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

Вот ошибка я получаю:

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

Любая помощь очень ценится!

ответ

20

Вы должны либо определить свои бобы в xml, либо аннотировать их, но не оба (только для того, чтобы избежать ошибок, подобных тому, который вы получаете).

Проблема заключается в том, что вы не являетесь автоповтором конструкторов args, поэтому весна не знает, что делать с вашим контроллером. Он знает, что он должен создать компонент (@Controller аннотации), но он не знает, как (нет стандартного или автономного конструктора).

Вы можете попробовать сделать что-то вроде:

@Controller 
public class CacheHandler { 

private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

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

, а затем в XML:

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

Так будет autowire параметры конструктора.

Другой вариант - просто создать конструктор по умолчанию и свойство autotire gxSessionIdCache.

+0

мы разделяем ту же самую идею ;-) –

+0

замечательные, спасибо за все ответы! – Rory

+1

Отлично, чтобы подтвердить это, весне нужен либо конструктор по умолчанию, либо автоматический проводной конструктор. – lwpro2

2

Вы должны добавить пустой конструктор по умолчанию:

@Controller 
    public class CacheHandler { 

    private final CustomGxSessionIdCacheImpl gxSessionIdCache; 

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

Но будьте осторожны, потому что кажется, что вы смешиваете конфигурацию аннотаций на основе (@Controller) и конфигурации XML. В приведенном выше примере он использует конфигурацию на основе аннотаций (поэтому, пожалуйста, удалите объявление компонента из вашего XML-файла).

+1

Почему конструктор по умолчанию? Это не обязательно? – kosa

+0

Я только что редактировал свой пост. –

+0

[Имеет ли Spring все компоненты, чтобы иметь конструктор по умолчанию?] (Http://stackoverflow.com/questions/7492652/does-spring-require-all-beans-to-have-a-default-constructor): [* * нет **] (http://stackoverflow.com/a/7492713/545127) – Raedwald

0

Вы также можете получить эту ошибку, если вы не активировали конфигурацию Spring на основе аннотаций Spring. Включите это в Спринг Xml:

< контекст: аннотацию-конфиг/>

0

Другие плакаты указал, что вы можете получить проблемы, если вы смешиваете/компонент автоматического связывания-сканирования с явной конкретизации бобов. У меня была аналогичная проблема с веб-приложением, которое это сделало. Я смог устранить проблему, сообщив компонентному сканеру, чтобы он не создавал экземпляр компонента основного класса. Как это:

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

repository.xml, где включен явный боба экземпляра:

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