2010-07-18 1 views
1

Mon homecontroller a un objet UserService qui est câblé en utilisant le printemps correctement (il rend la page d'index très bien en utilisant une méthode pas UserService).UserDao est null, je suis mauvais câblage et besoin d'aide

Maintenant, je configure hibernate, donc à l'intérieur UserService j'ai un objet UserDao que j'essaye de câbler en utilisant le ressort.

@Service 
public class UserServiceImpl implements UserService{ 

    UserDao userDao; 

    public String sayHello() { 

     return "hello from user service impl part 2"; 

    } 

    public String getTestUser() { 





     return userDao.getById(1L).getUsername(); 

    } 

}

Alors ma HomeController était d'appeler la méthode 'sayHello' et il a été bien travaillé comme je l'ai dit.

@Controller 
public class HomeController { 

    @Autowired 
    private UserService userService; 




    @RequestMapping("/") 
    public ModelAndView Index() { 



     ModelAndView mav = new ModelAndView(); 

     mav.setViewName("index"); 
     mav.addObject("message", userService.sayHello()); 

     mav.addObject("username", userService.getTestUser()); 
     //userService.getTestUser(); 

     return mav; 
    } 

L'appel à userService.getTestUser() échoue, le UserDao est nulle.

Mon app-config.xml est:

<!-- Hibernate SessionFactory --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <!--<property name="packagesToScan" value="com.blah.core.db.hibernate"/> --> 
     <property name="configLocation" value="/WEB-INF/classes/hibernate.cfg.xml"/> 
     <property name="hibernateProperties"> 
      <value> 
       hibernate.dialect=org.hibernate.dialect.MySQLDialect 
       hibernate.connection.url=jdbc:mysql://localhost/blah 
       hibernate.connection.username=dbuser 
       hibernate.connection.password=123 
       hibernate.query.substitutions=true 'Y', false 'N' 
       hibernate.cache.use_query_cache=true 
       hibernate.cache.use_second_level_cache=true 
       hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider 
       hibernate.jdbc.batch_size=0 
      </value> 
     </property> 
    </bean> 

    <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> 


    <bean id="userDao" class="com.blah.core.db.hibernate.UserDaoImpl"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

Pourquoi mon UserDao null? Je dois faire quelque chose de mal avec le câblage?

De plus, si je décommode la ligne name = packagesToScan, ai-je vraiment besoin de définir un bean pour chaque Dao comme je l'ai fait avec UserDao? Est-ce que la sessionFactory sera câblée d'une manière ou d'une autre?

+0

En ce qui concerne votre question secondaire, vous pouvez utiliser @PersistenceContext dans la déclaration entitymanager dans le DAO pour éviter d'avoir à câbler la sessionfactory à chacun. – Affe

Répondre

2

Ajouter @AutoWired à utilisateurDao.

@Service 
public class UserServiceImpl implements UserService{ 

    @AutoWired 
    UserDao userDao; 

    ... 
} 

Et assurez-vous que vous avez mis en place <context:component-scan/> pour scanner les paquets que vos @Service s et @Controller s sont.

+0

mon service et les contrôleurs fonctionnent comme j'ai auto-scan, merci pour le conseil de toute façon. – Blankman

0

Comme Krock mentionné, votre UserDao n'est pas « câblé » correctement dans votre UserService. Avez-vous même essayé sa suggestion?

Questions connexes