IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Afficher une liste avec Spring IOC [Framework]


Sujet :

Spring Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Par défaut Afficher une liste avec Spring IOC
    Bonjour,

    J'essaye de me familiariser avec spring. J'utilise avec JSF. Dans ma base de données, j'ai une table honey qui a pour champs id, taste et name. J'ai plusieurs enregistrement dans ma table et j'aimerai les récupérer pour les afficher dans ma jsp avec un datatable.

    J'ai donc un HoneyDao qui récupère les éléments de ma table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class HoneyDao extends HibernateDaoSupport{
     
    	public HoneyDao(){
     
    	}
     
     
    	public ArrayList<Honey> getHoneys(){
    		ArrayList<Honey> honeys= (ArrayList<Honey>) getHibernateTemplate().loadAll(Honey.class);
    		return honeys;
    	}
     
    }
    J'ai ensuite créer une classe HoneyDaoListe pour récupérer ma liste d'éléments de la table

    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
    18
    19
    20
    21
    22
    public class HoneyDaoListe {
     
     
    	private ArrayList<HoneyDao> honeydaos = new ArrayList<HoneyDao>();
     
    //	public HoneyDaoListe(){
    //		
    //	}
     
     
    	public HoneyDaoListe(HoneyDao honeyDao){
    		this.honeydaos.add(honeyDao);
    	}
     
    	public ArrayList<HoneyDao> getHoneydaos(){
    		return this.honeydaos;
    	}
     
    	public void setHoneydaos(ArrayList<HoneyDao> hon){
    		this.honeydaos=hon;
    	}
    }

    Pour finir dans mon controller, je récupère cette liste que je veux afficher:

    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
    18
    19
    20
    21
    22
    23
    public class ListController {
     
     
    	private Model model;
     
    	public ListController(){
     
    	}
     
    	public ListController(HoneyDaoListe honeyDaoListe){
    		this.model = new SimpleModel();
    		this.model.setDatas(honeyDaoListe);
    	}
     
    	public Model getModel() {
    		return this.model;
    	}
     
    	public void setModel(Model model) {
    		this.model = model;
    	}
     
    }

    dans mon applicationContext.xml, j'ai :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
     
    <bean id="HoneyDaoTarget" class="com.user.dao.HoneyDao">
    <property name="sessionFactory"><ref local="sessionFactory"/></property>
    </bean>
     
     
    <bean id="HoneyDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager"><ref local="transactionManager"/></property>
    <property name="target"><ref local="HoneyDaoTarget"/></property>
    <property name="transactionAttributes">
    <props>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="store*">PROPAGATION_REQUIRED</prop>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean>
     
    <bean id="HoneyDaoListe" class="com.user.liste.HoneyDaoListe">
    <constructor-arg><ref local="HoneyDaoTarget"/></constructor-arg>
    </bean>
     
    <bean id="Controller" class="com.user.controller.ListController">
    <constructor-arg><ref local="HoneyDaoListe"/></constructor-arg>
    </bean>

    Le problème est le suivant:

    J'arrive à récupérer ma liste quand j'instancie mon listecontroller, mais dès que j'injecte dans mon model la liste et que je fais mon getModel, j'obtiens null sur mon champ "model".

    Quelqu'un aurait-il une idée? Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 141
    Par défaut
    Bonjour, pourquoi tu initialises pas ton model à l'extérieur du constructeur?Et même ton model, tu peux le mettre en argument du constructeur vu comment tu présentes les choses, et l'initialiser dans le conteneur, puis faire seulement un this.model=model; model.setDatas(..). En fait tu fais beaucoup de tournure, ton code n'est pas optimisé, tu peux faire plus simple.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Par défaut
    Merci pour la réponse.

    Comme je débute, tous les conseils sont les bienvenus !

    J'ai donc essayé de suivre ce que tu m'as dit en mettant un argument dans mon controller:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public ListController(HoneyDaoListe honeyDaoListe, SimpleModel model){
    		this.model=model;
    		this.model.setDatas(honeyDaoListe);
    	}
    Dans le fichier applicationContext.xml, j'ai créé un bean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <bean id="Model" class="com.user.controller.SimpleModel">
    </bean>
    et j'ai rajouté l'argument dans mon constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    <bean id="Controller" class="com.user.controller.ListController">
    <constructor-arg><ref local="HoneyDaoListe"/></constructor-arg>
    <constructor-arg><ref local="Model"/></constructor-arg>
    </bean>
    Mais le problème persiste. Quand je suis dans le constructor de mon controller, j'ai bien mon objet; dès que je l'injecte dans mon modèle et que je fais un getModel, model se met à null.

    Normalement quand on créé un objet dans une classe et qu'on l'appelle ensuite, il ne devrait pas se remettre à null... si?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 141
    Par défaut
    J'essaie de trouver une solution mais il ya trop de dispersion de codes et ca me pertube vu que je vois pas ton projet en entier. Je te propose 2 solutions pour ton controleur
    1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class ListController {
     
                 @Autowired	
    	private Model model;
     
    	public ListController(){
     
    	}
     
    	public ListController(HoneyDaoListe honeyDaoListe){
    		model.setDatas(honeyDaoListe);
    	}
    }
    Avec cette solution tu ne déclares pas ton model comme étant un argument de ton contrôleur.
    2)
    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
    18
    public class ListController {
     
    	private Model model;
     
    	public ListController(){
     
    	}
     
    	public ListController(HoneyDaoListe honeyDaoListe){
    		model.setDatas(honeyDaoListe);
    	}
                 public Model getModel(){
                          return model;
                 }
                 public void setModel(Model model){
                          this.model=model;
                 }
    }
    Avec cette solution, tu ne déclares toujours pas ton model comme étant un argument du contrôleur mais plutôt comme une propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <bean id="Controller" class="com.user.controller.ListController">
    <constructor-arg name="HoneyDaoListe" ref="HoneyDaoList"/>
    <property name="modele" ref="model">
    </bean>
    L'annotation @Autowired peut être utliser dans la seconde solution sur le getter ou le setter mais essaies déjà de faire ca.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Par défaut
    Bonjour,

    Alors j'ai repris un exemple plus simplifié.

    Donc j'ai une classe Honey (mon bean) qui implémente serialisable;
    - une classe HoneyDao pour récupérer la table honey;
    - un controller HoneyListController pour afficher ma liste de honey;
    - une classe ServiceFinder qui fait le lien entre mon fichier applicationContext et mon controller.

    Le problème que j'avais dans l'exemple du début de la discussion est que j'arrivai à instancier mon controller mais je n'arrivais pas à injecter mon instance de HoneyDao dans ma méthode getHoneys.

    Avec mon nouvel exemple, je fais appel à ServiceFinder qui possède une méthode findBean.

    Je vous joins mes différentes classes:

    HoneyDao
    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
    18
    19
    20
    21
    22
     
    public class HoneyDao extends HibernateDaoSupport{
     
    	ArrayList<Honey> honeys = null;
     
    	public HoneyDao(){
    	}
     
     
     
     
    	public ArrayList<Honey> getHoneys(){
    	 honeys= (ArrayList<Honey>) getHibernateTemplate().loadAll(Honey.class);
    		return this.honeys;
    	}
     
    	public void setHoneys(ArrayList<Honey> honeys){
    		this.honeys=honeys;
    	}
     
     
    }
    HoneyListController

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    public class HoneyListController {
     
    	private HoneyDao honeyDao;
    	private ArrayList<Honey> honeys;
     
    	public HoneyListController(){
     
    	}
     
     
     
    //	public HoneyDao getHoneyDao(){
    //		return this.honeyDao;
    //	}
    //	
    //	public void setHoneyDao(HoneyDao honeyDao){
    //		this.honeyDao=honeyDao;
    //	}
     
    	public ArrayList<Honey> getHoneys(){
    		HoneyDao honeyDao=(HoneyDao) ServiceFinder.findBean("honeyDao");
    		return honeyDao.getHoneys();
    	}
     
     
    }
    ServiceFinder

    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
    18
    19
    20
     
    public class ServiceFinder {
     
    	public static Object findBean(String beanName){
    	    FacesContext context= FacesContext.getCurrentInstance();
     
    	    ServletContext servletContext = 
    	        (ServletContext)context.getExternalContext().getContext();
    	    ApplicationContext appContext =
    	        WebApplicationContextUtils.getWebApplicationContext(servletContext);
     
    	    Object o =appContext.getBean(beanName);
     
    	    return o;
     
    	  }
     
     
     
    }
    Dans mon applicationContext.xml je ne déclare que le bean HoneyDao

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    <bean id="honeyDao" class="com.honey.HoneyDao">
    <property name="sessionFactory"><ref local="sessionFactory"/></property>
    </bean>
    Pourrait-on injecter le bean HoneyDao dans ma méthode getHoneys() de mon HoneyListController pour éviter de passer par ServiceFinder ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 141
    Par défaut
    Utilises ton contrôleur comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class HoneyListController {
    	@Autowired
    	private HoneyDao honeyDao;
    	public HoneyListController(){
     
    	}
     
    	public ArrayList<Honey> getHoneys(){
    		return honeyDao.getHoneys();
    	}
     
     
    }
    Oublie pas de déclarer ton contrôleur dans le fichier de configuration de Spring

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Par défaut
    Bonjour,

    J'ai donc essayer de me familiariser avec les annotations, mais ce n'est pas gagné...

    J'ai déjà ajouté des librairies spring, puis j'ai modifié mon applicationContext.xml. voici le code:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    <?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:p="http://www.springframework.org/schema/p"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans-3.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.5.xsd">
     
    	<context:annotation-config />
     
     
    	<bean id="dataSource"
    		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName">
    			<value>org.postgresql.Driver</value>
    		</property>
    		<property name="url">
    			<value>jdbc:postgresql://localhost:5432/postgres</value>
    		</property>
    		<property name="username">
    			<value>postgres</value>
    		</property>
    		<property name="password">
    			<value>postgres</value>
    		</property>
    	</bean>
     
     
    	<bean id="sessionFactory"
    		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="mappingResources">
    			<list>
    				<value>com/honey/Honey.hbm.xml</value>
    			</list>
    		</property>
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.dialect">
    					org.hibernate.dialect.PostgreSQLDialect
    				</prop>
    				<prop key="hibernate.show_sql">true</prop>
    				<prop key="hibernate.cglib.use_reflection_optimizer">
    					true
    				</prop>
    				<prop key="hibernate.cache.provider_class">
    					org.hibernate.cache.HashtableCacheProvider
    				</prop>
    			</props>
    		</property>
    		<property name="dataSource">
    			<ref bean="dataSource" />
    		</property>
    	</bean>
     
     
    	<bean id="transactionManager"
    		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory">
    			<ref local="sessionFactory" />
    		</property>
    	</bean>
     
     
    	<bean id="honeyDao" class="com.honey.HoneyDao">
    		<property name="sessionFactory">
    			<ref local="sessionFactory" />
    		</property>
    	</bean>
     
     
    	<bean id="honeyController" class="com.honey.HoneyListController">
    		<constructor-arg>
    			<ref local="honeyDao" />
    		</constructor-arg>
    		<!-- 
    			<property name="honeyDao"><ref local="honeyDao"/></property>
    		-->
    	</bean>
     
     
    </beans>
    J'y ai donc rajouté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     http://www.springframework.org/schema/beans/spring-beans-3.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.5.xsd">
     
    	<context:annotation-config />
    Ensuite dans mon controller, j'ai essayé de mettre @Autowired sur mon champ honeyDao ou sur mes getters et setters, mais mon champ honeyDao est toujours vide et j'obtiens un NPE.

    voici le code de mon controller

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    package com.honey;
     
    import java.util.ArrayList;
     
    import org.springframework.beans.factory.annotation.Autowired;
     
     
    public class HoneyListController {
     
    	@Autowired
    	private HoneyDao honeyDao;
     
    	private ArrayList<Honey> honeys;
     
    	public HoneyListController(){
     
    	}
     
    	public HoneyListController(HoneyDao honeyDao){
     
    		this.honeyDao=honeyDao;
    	}
     
     
    	public HoneyDao getHoneyDao(){
    		return this.honeyDao;
    	}
     
    	public ArrayList<Honey> getHoneys(){
    //		HoneyDao honeyDao=(HoneyDao) ServiceFinder.findBean("honeyDao");
    		return honeyDao.getHoneys();
    	}
     
    	public void setHoneys(ArrayList<Honey> honeys){
    		this.honeys=honeys;
    	}
     
    	public void setHoneyDao(HoneyDao honeydao){
    		this.honeyDao=honeydao;
    	}
     
    }
    Quand je lance l'application, mon controller s'instancie correctement avec ma liste de honeyDao, mais lorsque je tente d'afficher la page avec ma liste, mon honeyDao qui se trouve null lève une exception NPE.

    Pourriez-vous me dire si mon applicationContext est bien configuré, d'ou vient mon erreur ??? D'autre part si quelqu'un avait un tutorial sur les annotations pour débutant, je suis preneur. Merci encore

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 141
    Par défaut
    Soit tu enlèves l'annotation @Autowired sur ton honeyDao dans la classe de ton controller soit tu vires le <construtor-arg> dans la déclaration du controller dans le contenur de Spring, tu mélanges un peu tout. Pourtant je t'ai montré une manière de faire.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Par défaut
    Quelle Galère ces annotations !

    Je commence à m'y perdre complètement. Tout d'abord, j'aimerais savoir si ma configuration est correcte.

    J'ai rajouté dans mon classpath les librairies:

    spring-framework-3.0.5 RELEASE

    puis j'ai rajouté dans mon applicationContext.xml le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    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">
     
    	<context:annotation-config />
    J'ai ensuite déclaré mon bean honeyDao et mon controller:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    	<bean id="honeyDao" class="com.honey.HoneyDao">
    		<property name="sessionFactory">
    			<ref local="sessionFactory" />
    		</property>
    	</bean>
     
    	<bean id="honeyController" class="com.honey.HoneyListController">
    	<property name="honeyDao">
    			<ref local="honeyDao" />
    		</property>
    	</bean>

    Dans mon HoneyDao mon code est le suivant:

    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
     
    public class HoneyDao extends HibernateDaoSupport {
     
    	ArrayList<Honey> honeys = new ArrayList<Honey>();
     
    	public ArrayList<Honey> getHoneys(){
    		honeys= (ArrayList<Honey>) getHibernateTemplate().loadAll(Honey.class);
    		return this.honeys;
    	}
     
    	public void setHoneys(ArrayList<Honey> honeys){
    		this.honeys=honeys;
    	}
     
     
    }

    et mon controller:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    public class HoneyListController {
     
    	@Autowired
    	private HoneyDao honeyDao;
     
    	public HoneyListController(){
    	}
     
     
    	public ArrayList<Honey> getHoneys(){
    		return honeyDao.getHoneys();
    	}
     
     
    	public void setHoneyDao(HoneyDao honeyDaos){
    		this.honeyDao=honeyDaos;
    	}
     
    	public HoneyDao getHoneyDao(){
    		return this.honeyDao;
    	}
     
    	public void setHoneys(ArrayList<Honey> honeys){
    		this.honeyDao.setHoneys(honeys);
    	}
     
     
    }
    Et bien sûr quand je lance l'appli, j'ai un NPE sur mon honeyDao.getHoneys()...

    J'ai bien évidemment essayé de mettre mon @Autowired sur le setter et getter mais ca ne fonctionne pas. Le seul truc qui marche (mais là je n'arrive pas à garder mon objet, c'est lorsque je déclare mon honeyDao dans le constructor de mon controller...

    Si quelqu'un a une piste... merci d'avance

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 141
    Par défaut
    Tu mélanges tout, je te propose des solutions tu les utilises pas c'est normal, en même temps tu utilises @Autowired en même tu initilialises les propriétés de l'objet ce qui crée 2 instances différentes. Au début ton objet contient bien les données mais au moment de l'appel, tu le réinitialises(tu crées une nouvelle instance qui contient aucune donnée) d'où ton NPE. Maintenant je peux rien y faire si tu veux pas suivre les réponses que je te donne.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Par défaut
    Bon alors j'ai essayé de reprendre ce que tu m'as conseillé Fab.

    J'ai donc mis dans mon controller:

    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
    18
    19
    20
    21
    22
    23
    24
    25
     
    public class HoneyListController {
     
    	private SimpleModel model;
     
    	public HoneyListController(){
    	}
     
    	public HoneyListController(HoneyDao honeyDao){
    		model = new SimpleModel();
    		this.model.setDatas(honeyDao.getHoneys());
    	}
     
    //	public ArrayList<Honey> getHoneys(){
    //		return honeyDao.getHoneys();
    //	}
     
    	public SimpleModel getModel(){
            return this.model;
    }
     
    public void setModel(SimpleModel model){
            this.model=model;
    }
    }
    Alos pour info, j'ai été obligé d'instancier mon model dans le constructeur car sinon j'avais un NPE. A partir du constructeur, je récupère bien ma liste mais ensuite mon model se remet à null et je ne sais pas pourquoi...

    J'ai essayé de mettre le @Autowired à mon privte Model model, mais j'ai l'impression que ca ne fonctionne pas...

    Dans mon applicationContext.xml, j'ai mis:

    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
     
     
    	<bean id="honeyDao" class="com.honey.HoneyDao">
    		<property name="sessionFactory">
    			<ref local="sessionFactory" />
    		</property>
    	</bean>
     
    	<bean id="model" class="com.honey.SimpleModel">
    	</bean>
     
     
    	<bean id="honeyListController" class="com.honey.HoneyListController">
    	<constructor-arg><ref local="honeyDao"/></constructor-arg>
    <property name="model"><ref local="model"/></property>
     
    	</bean>
    Avec le constructeur, je récupère bien mon honeyDao et avec le property, j'injecte bien dans mon model ma liste de honeys.

    Mais c'est ensuite le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Autowired
    private SimpleModel model;
    Qui ne fonctionne pas, car mon model reste toujours à null.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 141
    Par défaut
    C'est quoi ton SimpleModel? oublie pas qu'au début tu as marqué que tu faisais du JSF fais juste attention de ne pas confendre les objets que tu utilises parce que je ne te suis plus.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Par défaut
    Mon SimpleModel est une classe qui implémente mon Model; voici son code:

    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
     
    package com.honey;
     
     
    public class SimpleModel implements Model {
     
    	private Object datas;
    	public SimpleModel() {
    	}
    	public Object getDatas(){
    	return this.datas;
    	}
    	public void setDatas(Object object){
    	this.datas = object;
    	}
     
    }

    Mais si tu préfères que je reprenne mon exemple sans le SimpleModel et avec mon HoneyDao uniqement je peux le reprendre; j'ai exactement le même problème de NPE.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 42
    Par défaut
    J'ai enfin trouvé ce qui ne fonctionnait pas.

    Je déclarais mes beans dans applicationContext.xml; ils étaient bien créés au départ, mais ensuite quand je voulais en selectionner un, jsf me le créait à nouveau.

    Il faut donc ne pas définir les beans dans faces-config, mais uniquement dans applicationContext.xml. Dans faces-config, on rajoute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
     <application> 
        <el-resolver> 
        org.springframework.web.jsf.el.SpringBeanFacesELResolver 
        </el-resolver> 
      </application>
    et dans le controller on met comme annotation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @Controller("clientsController")

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. afficher une liste avec 2 classes liées
    Par hibernate_lmb dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/08/2008, 12h06
  2. Afficher une liste avec photo dans un gridview
    Par peregna2007 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 05/07/2008, 16h52
  3. afficher une liste avec bottom
    Par nadhem dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 23/10/2007, 19h53
  4. Afficher une liste avec un lien
    Par zorro13 dans le forum Struts 1
    Réponses: 2
    Dernier message: 22/08/2007, 09h58
  5. Afficher une liste, avec 2 résultats par ligne
    Par toutoune60 dans le forum JSF
    Réponses: 5
    Dernier message: 12/02/2007, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo