Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring. Проблема с инициализацией бина.


Автор: unreger 7.6.2009, 14:37
пытаюсь создать (Maven2 Spring Hibernate JPA TestNG) проект
проблема с инициализацией бина
simple тест работает
advanced выдает:
Код

.....
Bean property 'dictionaryDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
.....

Поискал конечно. Проблема встречается часто, но ответы в основном  - проверь есть ли сеттер. Но у меня-то он есть.

Тестовый класс
Код

@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class DictionaryPersonServiceTest {
    private static org.slf4j.Logger log = LoggerFactory.getLogger(DictionaryPersonServiceTest.class);

    private ApplicationContext appContext;
    
    @Test
    public void advanced() {
        appContext = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");

        IDictionaryService dictionaryService = (IDictionaryService) appContext.getBean("dictionaryPersonService");

        for (int i = 0; i < 5; i++) {
            dictionaryService.addHeader("header_" + i);
        }

        List lst = dictionaryService.getHeadersList();
        for (int i = 0; i < 5; i++) {
            DictionaryPerson item = (DictionaryPerson) (lst.get(i));
            log.debug(item.getItem());
        }
        
    }

    @Test(enabled = false)
    public void simple() {

        DictionaryPersonDaoImpl dictionaryPersonDaoImpl = new DictionaryPersonDaoImpl();
        DictionaryPersonServiceImpl dictionaryPersonServiceImpl = new DictionaryPersonServiceImpl();
        dictionaryPersonServiceImpl.setDictionaryDao(dictionaryPersonDaoImpl);

        for (int i = 0; i < 5; i++) {
            dictionaryPersonServiceImpl.addHeader("header_" + i);
        }

        List lst = dictionaryPersonServiceImpl.getHeadersList();
        for (int i = 0; i < 5; i++) {
            DictionaryPerson item = (DictionaryPerson) (lst.get(i));
            log.debug(item.getItem());
        }

    }
}


applicationContext.xml
Код

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <bean id="dictionaryPersonDao" class="nb.dao.person.DictionaryPersonDaoImpl"/>
    <bean id="dictionaryPersonService" class="nb.service.person.DictionaryPersonServiceImpl">
        <property name="dictionaryDao">
            <ref local="dictionaryPersonDao"/>
        </property>
    </bean>
</beans>


Интерфейс сервисного класса
Код

public interface IDictionaryService {
    public void setDictionaryDao (IDictionaryDao dao);

    public List getHeadersList();
.........
}

Реализация
Код

public class DictionaryPersonServiceImpl implements IDictionaryService {
    private IDictionaryDao dictionaryDao;
............

    public DictionaryPersonDaoImpl getDictionaryDao() {
        return (DictionaryPersonDaoImpl) dictionaryDao;
    }

    public void setDictionaryDao(IDictionaryDao dictionaryDao) {
        this.dictionaryDao = dictionaryDao;
    }

    public List getHeadersList() {
        return dictionaryDao.getHeaderList();
    }
.......
}

Автор: garbuz 7.6.2009, 23:24
У вас скорее всего какая-то путаница с классами
читаем 
http://forum.springsource.org/showthread.php?t=18525
http://forum.springsource.org/showthread.php?t=15522

Цитата

public interface IDictionaryService {
    public void setDictionaryDao (IDictionaryDao dao);
    public List getHeadersList();
.........
}

Сетить объекту свойство посредством реализации интерфейсного метода как-то не правильно, мне кажется... smile 

Автор: Старовъръ 7.6.2009, 23:49
Цитата
Сетить объекту свойство посредством реализации интерфейсного метода как-то не правильно, мне кажется...
В данном случае это оправдано, это класс-сервис, setDao() у него - основной метод. Бывает, что это единственный метод в EntitySerivce-интерфейсах smile А вот геттер для дао вообще нужно убрать, он там бесполезен. Может это из-за него ошибка, т.к. гет/сет методы не совпадают по типам? Ибо 
Цитата
Does the parameter type of the setter match the return type of the getter?
Вот это смущает..
Код
        <property name="dictionaryDao">
            <ref local="dictionaryPersonDao"/>
        </property>
Свойства легче устанавливать так:
Код
        <property name="dictionaryDao" ref="dictionaryPersonDao"/>

Автор: unreger 8.6.2009, 00:32
АААА!!!! Спасибо! Убрал геттер и все заработало!
Вот оно - зло автогенерации. 

Про установку свойств. Это я уже с горя развернул.
Есть способ еще лучше:
Код

<bean id="dictionaryPersonService" class="nb.service.person.DictionaryPersonServiceImpl" p:dictionaryDao-ref="dictionaryPersonDao"/>

особенно если свойств много.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)