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 :

Optimisation Binding AbstractWizardFormController


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut Optimisation Binding AbstractWizardFormController
    Bonjour à tous,

    J'utilise un formulaire à pages multiples. Ma première page contient des listes déroulantes alimentées par Hibernate. Par exemple, une liste d'"initiatives" et de "satisfactions". La valeur du select est un identifiant (retourné en string dans le request) et je dois récupérer un objet de type Initiative et un objet de type Satisfaction.

    J'arrive au résultat désiré en utilisant "PropertyEditorSupport".
    Ne peut-on pas utiliser le binding comme pour une page simple ? Cela implique d'écrire des propertyEditorSupport pour chaque champs de type select..

    Voici la méthode testée avec le Binder :
    Un morceau 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
     
    @Override
    	protected void initBinder(HttpServletRequest request,
    			ServletRequestDataBinder binder) throws Exception {
    		Rapport rap = (Rapport)binder.getTarget();
    		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");    
    		df.setLenient(false);    
    		binder.registerCustomEditor(Date.class, new CustomDateEditor(df, true));
     
    		try
    		{
    			long initId = Long.parseLong(request.getParameter("initiative"));
    			if(initId > 0) {
    				Initiative init = this.initiativManager.getObjById(initId);
    				rap.setInitiative(init);
    			}
    		}catch(Exception e){System.out.println(e.getMessage());}
    	}
     
     
      @Override
    protected Map referenceData(HttpServletRequest request, Object command,
    		Errors errors, int page) throws Exception {
    		Map<Object, Object> dataMap = new HashMap<Object, Object>();
    		initiativManager.loadClass(Initiative.class);
    		dataMap.put("initiList",this.initiativManager.getList());
     
    	 	return dataMap;
    }
     
    protected void validatePage(Object command, Errors errors, int page){
        Rapport rap = (Rapport) command;
        System.out.println("nb erreurs : " + errors.getErrorCount());
        if(page == 0){
          if(rap.getSubject()==""){
            errors.rejectValue("subject", "error.too-high", null, "Le sujet ne peut être vide.");        
          }
          if(rap.getInitiative() == null){
              errors.rejectValue("initiative", "error.too-high", null, "Vous devez choisir une option.");        
          }
        }
      }
    Voici l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Failed to convert property value of type [java.lang.String] to required type [pjx.bean.Initiative] for property initiative; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [pjx.bean.Initiative] for property initiative: no matching editors or conversion strategy found
    Pourtant dans le validatePage, grâce à l'initBinder que j'ai réécrit, je n'ai pas l'erreur "Vous devez choisir une option", lorsque j'interroge rap.getInitiative().getName() , j'ai bien la bonne valeur issue du formulaire...

    J'ai tenté aussi de faire le bind dans la méthode onBindAndValidate, mais même chose..

    Maintenant, la méthode utilisant le PropertyEditorSupport :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    @Override
    	protected void initBinder(HttpServletRequest request,
    			ServletRequestDataBinder binder) throws Exception {
    		Rapport rap = (Rapport)binder.getTarget();
    		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");    
    		df.setLenient(false);    
    		binder.registerCustomEditor(Date.class, new CustomDateEditor(df, true));
     
    		InitiativeTypePropertyEditor initTpe = new InitiativeTypePropertyEditor();
    		initTpe.setInitiativManager(initiativManager);
    		binder.registerCustomEditor(Initiative.class,initTpe);
    	}
    Avec 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
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    public class InitiativeTypePropertyEditor extends PropertyEditorSupport{
    	private CommonManager<Initiative> initiativManager;
     
    	public CommonManager<Initiative> getInitiativManager(){
    		return initiativManager;
    	}
    	public void setInitiativManager(CommonManager<Initiative> manag){
    		initiativManager = manag;
    	}
     
    	public void setAsTest(String text)
    	{
     
    	}
    	@Override
    	public void setAsText(String arg0) throws IllegalArgumentException {
    		Initiative init = initiativManager.getObjById(Long.parseLong(arg0));
    		this.setValue(init);
    	}
    }
    Plus d'erreur, mais lorsque mon formulaire est de nouveau appelé (erreur sur un autre champs ou autre raison), la valeur du select est perdue, il se repositionne sur "Choisissez une option" plutôt que l'option elle même déjà enregistrée.


    Pourriez-vous me dire quel est le meilleur procédé ?

    Merci d'avance

  2. #2
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Ps: Ok, grâce aux Generics, je n'utilise qu'une classe PropertyEditor...

    Mais j'ai toujours le soucis où le select n'affiche pas la valeur déjà sélectionnée...
    Et toujours ma question, pourquoi ne peut-on pas utiliser directement le binder ?

    Merci !

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  2. Optimisation SQL et BIND variable
    Par exempleinfo dans le forum Administration
    Réponses: 21
    Dernier message: 17/09/2008, 15h38
  3. Débutant : optimisation BIND ?
    Par henzer dans le forum Administration système
    Réponses: 1
    Dernier message: 10/07/2007, 09h48
  4. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 08h47
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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