Spring MVC не найден конструктор по умолчанию? - PullRequest
12 голосов
/ 15 февраля 2012

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

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

Вот начало 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>()

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

Ответы [ 4 ]

20 голосов
/ 15 февраля 2012

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

Проблема здесь в том, что вы не используете автопроводку аргументов конструкторапоэтому весна не знает, что делать с вашим контроллером.Он знает, что должен создать bean-компонент (@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 gxSessionIdCache.

2 голосов
/ 15 февраля 2012

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

    @Controller
    public class CacheHandler {

    private final CustomGxSessionIdCacheImpl gxSessionIdCache;

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

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

0 голосов
/ 11 декабря 2014

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

 <?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>
0 голосов
/ 13 декабря 2012

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

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

...