Bon, je m'arrache un peu les cheveux car je ne comprends pas ce que j'oublie.
J'utilise Spring et Spring MVC avec Jetty.
Je souhaite utiliser l'annotation Autowired pour charger un service dans un controller.
Lorsque je lance Jetty, j'ai une erreur sur le champ que j'essaie d'autowireL'application-context.xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Embedded error: Error creating bean with name 'loggedInPageController': Autowiring of fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private bla.bla.bla.business.SecurityService bla.bla.bla.web.LoggedInPageController.securityService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [bla.bla.bla.business.SecurityService] is defined: Unsatisfied dependency of type [interface bla.bla.bla.business.SecurityService]: expected at least 1 matching bean
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <?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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" 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/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config /> <context:component-scan base-package="bla.bla.bla.*"/> ... </beans>
Ca fonctionne quand je fais de l'autowired entre une classe de la couche DAO et ma sessionFactory d'hibernate.
Ca fonctionne aussi pour une classe de service et la classe de la DAO appelée.
Mais ça ne marche pas entre une classe Controller et une classe de Service. J'ai aussi essayé pour voir Controller avec DAO et ça ne marche pas.
Le controller :
Le service en question
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 @Controller @RequestMapping("/loggedin.html") public class LoggedInPageController { @Autowired private SecurityService securityService; @RequestMapping(method = RequestMethod.GET) public String authenticate(String login, String password, ModelMap model) { User user = securityService.authenticate(login, password); model.addAttribute(user); return "loggedIn"; } }
J'ai essayé sans annotation en rajoutant un setter sur le service dans mon Controller et ça dans l'app context et ça fonctionne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 @Service("securityService") public class SecurityServiceImpl implements SecurityService { @Autowired private SecurityDao securityDao; public User authenticate(String login, String password) { return securityDao.authenticate(login, password); } }
Alors qu'est ce que j'oublie avec le autowired du controller ??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 bean id="securityDao" class="bla.bla.bla.dao.SecurityDaoImpl"> <property name="sessionFactory" ref="mySessionFactory"/> </bean> <bean id="securityService" class="bla.bla.bla.business.SecurityServiceImpl"> <property name="securityDao" ref="securityDao"></property> </bean> <bean id="loggedInPageController" class="bla.bla.bla.web.LoggedInPageController"> <property name="securityService" ref="securityService"/> </bean>
Partager