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

Struts 1 Java Discussion :

[Struts 1.3.5] BeanUtils.populate


Sujet :

Struts 1 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut [Struts 1.3.5] BeanUtils.populate
    Bonsoir,

    Ça faisait longtemps que je n'avais pas vu cette erreur :
    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
     
    exception
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:453)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:45)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:57)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    java.lang.NullPointerException
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:427)
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:340)
    	org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:684)
    	org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715)
    	org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:884)
    	org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    	org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:451)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:45)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:57)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    Je me rappelle qu'il s'agit d'un bean supposé être en scope session, mais je ne me souviens plus comment faire.

    Alors, pour mon cas, il s'agit d'un bean déjà initialisé en base de données qui sera modifié.

    Le bean 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 JourneeForm extends ActionForm {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private RencontreForm[] liste;
     
    	public void setListe(RencontreForm[] liste) {
    		this.liste = liste;
    	}
    	public RencontreForm[] getListe() {
    		return liste;
    	}
    }
    Stockage du bean avant appel du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		request.getSession().setAttribute(Constantes.AttribJourneeModifiee, j);
    		request.setAttribute(Constantes.AttribNumeroJournee, f.getAction());
    		return mapping.findForward("JOURNEE_MODIFIEE");
    Formulaire :
    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
     
    <%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="h" %>
    <%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="b" %>
    <%@ taglib uri="/WEB-INF/tld/struts-logic.tld" prefix="l" %>
    <%@ taglib uri="/WEB-INF/tld/struts-nested.tld" prefix="n" %>
    <b:define id="JOURNEE_MODIFIEE" name="JOURNEE_MODIFIEE" type="presentation.bean.JourneeForm" scope="session"/>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <h:html>
    <head>
    	<title><b:message key="application.nom"/></title>
    	<link type="text/css" rel="stylesheet" href="<b:message key="application.path"/>/css/style.css">
    </head>
    <body>
    	<h1>Modifier une journée</h1>
    	<h:form action="/validJournee.do">
    	<table class="match">
    		<tr>
    			<th colspan="4" class="centre">Journée <b:write name="NUMERO_JOURNEE"/></th>
    		<tr>
    		<n:iterate name="JOURNEE_MODIFIEE" property="liste">
    		<tr>
    			<td class="droite"><n:write property="labelEquipeR"/></td>
    			<td class="centre"><n:text property="scoreR" maxlength="2" styleClass="score"/></td>
    			<td class="centre"><n:text property="scoreV" maxlength="2" styleClass="score"/></td>
    			<td class="gauche"><n:write  property="labelEquipeV"/></td>
    		</tr>
    		</n:iterate>
    		<tr>
    			<td colspan="4" class="centre"><h:submit styleClass="vert" value="Valider"/></td>
    		</tr>
    	</table>
    	</h:form>
    </body>
    </h:html>
    Quand j'appuie sur le bouton submit, l'exception se produit...

    Merci à toute personne qui pourrait m'aider.

  2. #2
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Tout d'abord, pour que la mise à jour fonctionne correctement avec les tags nested, il faut remplacer le tableau d'objets par une collection, une ArrayList par exemple.

    Ensuite, pour pouvoir mettre à jour les éléments de la collection via le formulaire, il faut initialiser la propriété liste de l'ActionForm via le setter.
    Il faut donc remplacer ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getSession().setAttribute(Constantes.AttribJourneeModifiee, j);
    par celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JourneeForm journeeForm=(JourneeForm) form ;
    journeeForm.setListe(j) ;
    Ceci suppose que le form-bean est référencé dans le mapping de l'Action dans laquelle tu mets ce code d'initialisation du formulaire.
    Et il faut mettre le scope du form-bean à session dans le mapping de cette Action et dans celui de l'Action qui s'exécute au submit du formulaire.

    Et enfin, il faut modifier le nested:iterate comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		<n:iterate property="liste">
    		<tr>
    			<td class="droite"><n:write property="labelEquipeR"/></td>
    			<td class="centre"><n:text property="scoreR" maxlength="2" styleClass="score"/></td>
    			<td class="centre"><n:text property="scoreV" maxlength="2" styleClass="score"/></td>
    			<td class="gauche"><n:write  property="labelEquipeV"/></td>
    		</tr>
    		</n:iterate>

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Bonjour ma chère c_nvy,

    Merci pour ta réponse.

    J'ai donc transformé le tableau en ArrayList<RencontreForm>, je n'ai plus d'exception, cependant, le formulaire attendu est vide. Comme quoi il y a déjà un très net progrès.

    Cela dit, je pense que je vais apporter de grosses modifications à ce projet car au niveau de Struts, il n'y a que des tableaux. De plus, je crois savoir pourquoi le tableau à afficher est vide : en outre, l'action est appelée avec un autre bean (SimpleForm, labellisé "simpleBean" dans struts-config.xml) et non JourneeForm (labellisé "journeeBean").

    L'instanciation et l'initialisation de JourneeForm ne changent rien au problème.

    Contenu partiel de struts-config.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        <form-beans>
    		<form-bean name="simpleBean" type="presentation.bean.SimpleForm"/>
    		<form-bean name="journeeBean" type="presentation.bean.JourneeForm"/>
        </form-beans>
     
     
        <action-mappings>
    		<action path="/modifJournee" name="simpleBean" type="presentation.accueil.ModifJournee" scope="session"/>
    		<action path="/validJournee" name="journeeBean" type="presentation.accueil.ValidJournee" scope="session"/>
        </action-mappings>
    SimpleForm ne contient qu'un simple entier (int), restituant le numéro de la structure JourneeForm.

    Dans l'action execute(...) de la classe ModifJournee, j'initialise JourneeForm, la JSP reste vide.

    J'ai l'impression que l'utilisation de ces deux beans provoque un conflit. J'ai donc créé une autre classe intermédiaire, ça ne change rien.

    Je vais essayer autre chose, mais si entre-temps quelqu'un avait une suggestion, je suis preneur ;-).

  4. #4
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Salut DomIII

    Alors, dans l'Action ModifJournee, tu peux créer une instance de l'ActionForm JourneeForm, initialiser la propriété liste, et mettre cette instance dans le scope session sous le même nom que celui définit dans le struts-config.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JourneeForm journeeBean= new JourneeForm();
    journeeBean.setListe(j) ;
    session.setAttribute("journeeBean",journeeBean);

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Merci !

    Je suis en train de modifier tous les tableaux en ArrayList, j'ai un peu cassé le projet Du coup je ne peux pas atteindre pour le moment cette portion de code.

    Ce projet, depuis deux semaines, m'aura bien épuisé !

    Je reviens dès que possible.

  6. #6
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    En fait, ça peut fonctionner avec des tableaux mais l'inconvénient des tableaux c'est que tu dois fixer leur taille, ce qui est contraignant.
    De plus, les tags Struts sont plus adaptés à des collections qu'à des tableaux.

    Sinon, si tu remplaces tous les tableaux en ArrayList, je te conseille d'y faire référence en utilisant l'interface List comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<RencontreForm> liste = new ArrayList<RencontreForm>();
    Pour plus d'informations, voir le chapitre Comment bien utiliser les collections de la FAQ Java.

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

Discussions similaires

  1. [struts] BeanUtils.populate
    Par otminou dans le forum Struts 1
    Réponses: 4
    Dernier message: 23/09/2007, 18h27
  2. Réponses: 7
    Dernier message: 19/07/2006, 14h43
  3. [struts BeanUtils.populate error] Passage deString a Date
    Par agougeon dans le forum Struts 1
    Réponses: 11
    Dernier message: 29/05/2006, 12h22
  4. [ struts ] "BeanUtils.populate"
    Par stela86 dans le forum Struts 1
    Réponses: 4
    Dernier message: 20/05/2006, 12h27
  5. [Struts][Tomcat ] HTTP 500 - BeanUtils.populate (Eclipse)
    Par pjfly dans le forum Tomcat et TomEE
    Réponses: 8
    Dernier message: 10/04/2004, 10h03

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