2012-04-19 3 views
2

Я пытаюсь @autowired в первый раз и не удается. Я читал так много примеров, и я, кажется, все делаю правильно, но когда мой код попадает в мой метод getLeagueDAO(), переменная экземпляра имеет значение null.Почему моя весна @autowired DAO не автоподключена?

У меня есть следующий код:

package com.example.app.service; 

@Service 
public class LeagueService { 

    // also tried @Autowired here, and that didn't work 
    private LeagueDAO leagueDao; // = new LeagueHibernateDAO(); 

    public LeagueDAO getLeagueDAO() { 
     return this.leagueDao; 
    } 

    @Autowired 
    public void setLeagueDAO(LeagueDAO dao) { 
     this.leagueDao = dao; 
    } 

    [ ... ] 

LeagueHibernateDAO:

package com.example.app.dao.impl.hibernate; 

import ... 

public class LeagueHibernateDAO implements LeagueDAO { 

    public LeagueHibernateDAO() { 
     super(); 
    } 

    [ ... ] 

Мой * -servlet.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" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 

     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 

     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
"> 

    <context:annotation-config/> 

    <context:component-scan base-package="com.example"/> 

    <mvc:annotation-driven /> 

    <bean id="LeagueDAO" class="com.example.app.dao.impl.hibernate.LeagueHibernateDAO" /> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/jsp/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
</beans> 

My Spring зависимостей являются:

... <org.springframework.version>3.0.6.RELEASE</org.springframework.version> ... 


    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

Мои модульные тесты не запускаются. Мое приложение не запускается. Все потому, что leagueDao не устанавливается в LeagueService. Почему он не подключается?

Мои Полное решение

В пользу тех, кто приходит вместе с подобными проблемами ...

1) Это ясно, что я не знаю, как написать тест autowired кода. Принятый ответ дает рабочий пример того, как это сделать.

2) Похоже, что при автопостановке это по существу все или ничего. Я уже создал приложение и хотел вернуться и автоустанавливать его. Поэтому я подумал, что начну с малого и автоматически откорректировать LeagueDAO в LeagueService. Однако, поскольку LeagueServiceTest не предоставил автопрограмму LeagueService, он не свяжет ссылки на LeagueDAO. Как только я должным образом проушился каждый шаг в цепочке, все сработало.

Итак, когда я попытался запустить приложение, хотя мои тесты теперь работали, мое приложение снова не было аутоавто. Чтобы исправить ситуацию, я, наконец, понял, что мне нужно полностью автоувеличивать другую цепочку. В этом случае у меня уже есть LeagueDAO, подключенный к LeagueService. Проблема заключалась в том, что LeagueService вызывается контроллером, который просто создавал экземпляр класса LeagueService, вызывая конструктор. Когда я включил Линуксервис в контроллер, все стало работать.

Я так много читал об этом, и если это объяснено где угодно, это не объяснялось так, как мне было ясно. Arrrgh.

+0

Могу ли я увидеть ваш код «LeagueHibernateDAO»? –

+0

Там я иду! Сразу после класса обслуживания. – Marvo

+0

Что такое пакет LeagueService? – andih

ответ

5

следующие работы

Unit Test

package com.example.app.service; 

import static org.junit.Assert.*; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.*; 

    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(locations={"/springcontext.xml"}) 
    public class TestLeagueService { 

     @Autowired 
     LeagueService service; 

     @Test 
     public void test() { 
      assertNotNull(service.getLeagueDAO()); 
     } 

    } 

DAO

package com.example.app.dao.impl.hibernate; 

public interface LeagueDAO { 

} 

Dao Impl

package com.example.app.dao.impl.hibernate; 

public class LeagueHibernateDAO implements LeagueDAO { 


    public LeagueHibernateDAO() { 
     super(); 
    } 
} 

Spring Контекст

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

    <context:annotation-config/> 

    <context:component-scan base-package="com.example"/> 


    <bean id="LeagueDAO" class="com.example.app.dao.impl.hibernate.LeagueHibernateDAO" /> 
    <bean id="LeagueService" class="com.example.app.service.LeagueService" /> 


</beans> 
+0

Я добавил материал теста Spring и после нескольких спотов, которые, похоже, работают. Тем не менее, он по-прежнему не автоподписывает ссылку DAO. Мои тесты продолжают сбой с нулевым указателем. (Мне действительно нужно иметь свои интерфейсы DAO в том же пакете, что и реализация?) – Marvo

+0

+1 для чистого модульного теста ... и да .. это тоже работает для меня –

+0

@Marvo Нет, вы можете разместить свои Intefaces везде, где вы хотеть. Для моего простого теста просто было проще разместить его в том же пакете, что и реализация. – andih

0

Вы проверили, чтобы увидеть, если Spring контейнер начинается при запуске приложения? Это может быть проблемой с вашей конфигурацией web.xml.

+0

Я действительно хотел указать, что хотя мой web.xml был прав, то, что я сбился с толку, было то, что Tomcat «правильно» установлен на Mac. Я забыл, что он входит в/Library и переустанавливает его на ~/Servers для моего удобства. Побочным эффектом было то, что скрипты, запущенные с ~/Servers/tomcat/bin, будут работать, но на самом деле они будут запускать код в/Library. Поэтому в каталоге ~/Servers/tomcat/logs не было никаких журналов, в результате чего я почесывал голову. Поэтому вы решили проблему, о которой я не спрашивал. знак равно – Marvo

Смежные вопросы