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

JSF Java Discussion :

nullpointerexception - <p:ajax> avec @ViewScoped


Sujet :

JSF Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut nullpointerexception - <p:ajax> avec @ViewScoped
    Salut tout le monde,

    je fais face à un problème que je n'arrive pas à résoudre. Le voici :

    J'affiche, en fonction d'un selectOneRadio différents inputext permettant de renseigner un critère spécifique :
    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
    <h:form id="form_principal">
    	<p:selectOneRadio id="options" value="#{rechercheBean.choix}">
    		<f:selectItem itemLabel="Critere 1" itemValue="c1" />
    		<f:selectItem itemLabel="Critere 2" itemValue="c2" />
    		<p:ajax update=":form_principal:critere" />
    	</p:selectOneRadio>
     
    	<h:panelGrid columns="1" id="critere">
    		<c:choose>
    			<c:when test="#{monBean.choix eq 'c1'}">
    				<h:outputText value="Critere 1 :" />
    				<p:inputText id="cr1" value="#{rechercheBean.critere1}" />
    			</c:when>
    			<c:when test="#{monBean.choix eq 'c2'}">
    				<h:outputText value="Critere 2 :" />
    				<p:inputText id="cr2" value="#{rechercheBean.critere2}" />
    			</c:when>
    		</c:choose>
    	</h:panelGrid>
    	<h:commandButton value="Ajouter critere" actionListener="#{monBean.ajouter}"/>
    </h:form>
    Coté ManagedBean, dans ma méthode "ajouter", je vais effectuer un traitement spécifique suivant le critère choisit.

    Ce que j'ai mis en place marche parfaitement lorsque mon managedBean est en @SessionScope.
    Je voudrais le passer en @ViewScoped mais lorsque je clique sur le bouton pour ajouter le critère, le critère est null lors du passage dans la méthode "Ajouter".

    Après différents tests, c'est le composant <p:ajax> qui pose problème car sans celui-ci, je retrouve bien mon critère coté managedBean. Cependant, j'ai besoin de ce composant pour pouvoir "switcher" entre mes inputexts.

    Comment puis-je faire pour régler ce problème ? Je tourne en rond depuis un bon moment

    merci par avance

  2. #2
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    peux-tu commencer par remplacer:
    ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:ajax update=":form_principal:critere" />
    par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <p:ajax render="critere" />
    ensuite peux-tu envoyer l´entete de tes declarations de ta page xhtml?

  3. #3
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    En effectuant ce changement, ça ne switch plus entre les différents inputext de mes critères.

    Voilà l'entête de mes fichiers xhtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <html xmlns="http://www.w3c.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:body>
    	<ui:composition template="/templates/template.xhtml">
    		<ui:define name="content">
    mais elle ne devrait pas changer en fonction du scope de mon managedBean. (Avec le scope Session, ma solution marche).

  4. #4
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    ya til une initialisation dans ton bean du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @PostConstruct
    public void init() {
    ...
    }
    Sinon peux-tu envoyer ton bean?

    Eric

  5. #5
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    Non, il n'y a aucune initialisation dans mon bean.

    mon bean n'a rien d'exceptionnel :
    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
    @ManagedBean(name="rechercheBean")
    @ViewScoped
    public class RechercheBean extends Message implements Serializable{
     
    	private static final long	serialVersionUID	= 6819859431493524895L;
     
    	/* Criteres */
    	private String choix;
    	private String critere1;
    	private String critere1;
     
     
    	/* Ajout critere */
    	public void ajouter() {
    		if (choix.equals("c1")) {
    			System.out.println(critere1);
    		}
    		else {
    			System.out.println(critere2);
    		}
     
    	}
     
    /*get & set ....*/
     
    }
    j'pense vraiment que le problème vienne du <p:ajax>

  6. #6
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    Il n'y a aucun autre moyen de mettre à jour un panelgrid en fonction d'un selectoneradio sans utiliser un <p:ajax> ?

  7. #7
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    teste ceci voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      private String choix = "c1"; // choix par defaut.

  8. #8
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    Citation Envoyé par jeffray03 Voir le message
    teste ceci voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      private String choix = "c1"; // choix par defaut.
    Je ne comprends pas l'utilité de ce test...

    Lorsque le managedbean est en ViewScoped, et que j'ajoute un critère, ma variable "choix" contient bien la bonne valeur choisie mais c'est le critère en question qui reste null (Celui qui est remplit par l'inputext).

  9. #9
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    utilises tu majorra?

  10. #10
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    voici le code que je viens de realiser, peux-tu l´essayer:
    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
     
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:p="http://primefaces.org/ui"
          xmlns:c="http://java.sun.com/jsp/jstl/core">
    <body>
    <div style="width:100%;font-size:36px;line-height:48px;background-color:navy;color:white">My Facelet Application</div>
      <h:form id="form_principal">
    	<p:selectOneRadio id="options" value="#{rechercheBean.choix}" valueChangeListener="#{rechercheBean.showCritere}"  onchange="submit()" immediate="true">
    		<f:selectItem itemLabel="Critere 1" itemValue="c1" />
    		<f:selectItem itemLabel="Critere 2" itemValue="c2" />
    	</p:selectOneRadio>
     
     
    	<h:panelGrid columns="1" id="critere2" rendered="#{rechercheBean.selectionC1}">	    
     
    				<h:outputText value="Critere 1 :" />
    				<p:inputText id="cr1" value="#{rechercheBean.critere1}" />
        </h:panelGrid>
        <h:panelGrid columns="1" id="critere3" rendered="#{rechercheBean.selectionC2}">
    	  <h:outputText value="Critere 2 :" />
    	  <p:inputText id="cr2" value="#{rechercheBean.critere2}" />
    	</h:panelGrid>
     
    	<h:commandButton value="Ajouter critere" action="#{rechercheBean.ajouter}"/>
    </h:form>
    </body>
    </html>
    et la 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
    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
    86
    87
    88
    89
    90
    91
     
    import java.io.Serializable;
     
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;
    import javax.faces.event.ValueChangeEvent;
     
    @ManagedBean
    @ViewScoped
    public class RechercheBean implements Serializable {
    	private static final long serialVersionUID = 6819859431493524895L;
     
    	/* Criteres */
    	private String choix = "";
    	private String critere1 = "";
    	private String critere2 = "";
    	private boolean selectionC1;
    	private boolean selectionC2;
     
    	public boolean isSelectionC1() {
    		return selectionC1;
    	}
     
    	public void setSelectionC1(boolean selectionC1) {
    		this.selectionC1 = selectionC1;
    	}
     
    	public boolean isSelectionC2() {
    		return selectionC2;
    	}
     
    	public void setSelectionC2(boolean selectionC2) {
    		this.selectionC2 = selectionC2;
    	}
     
    	/* Ajout critere */
    	public String ajouter() {
    		if (choix.equals("c1")) {
    			System.out.println(choix);
    			System.out.println(critere1);
    		} else {
    			System.out.println(choix);
    			System.out.println(critere2);
    		}
    		return null;
    	}
     
    	public void showCritere(ValueChangeEvent ev) {
    		choix = (String) ev.getNewValue();
    		if (choix == null) {
    			return;
    		}
    		System.out.println(choix);
    		if (choix.equals("c1")) {
    			selectionC1 = true;
    			selectionC2 = false;
    		} else if (choix.equals("c2")) {
    			selectionC1 = false;
    			selectionC2 = true;
    		} else {
    			selectionC1 = false;
    			selectionC2 = false;
    		}
    		// FacesContext.getCurrentInstance().renderResponse();
    	}
     
    	public String getChoix() {
    		return choix;
    	}
     
    	public void setChoix(String choix) {
    		this.choix = choix;
    	}
     
    	public String getCritere1() {
    		return critere1;
    	}
     
    	public void setCritere1(String critere1) {
    		this.critere1 = critere1;
    	}
     
    	public String getCritere2() {
    		return critere2;
    	}
     
    	public void setCritere2(String critere2) {
    		this.critere2 = critere2;
    	}
     
    }
    chez omoi ca marche correctement.

    Eric

  11. #11
    Membre très actif Avatar de bruneltouopi
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 308
    Par défaut
    tu peux utiliser la l'attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:ajax event="change" update="critere" />
    bref tu peux peux utiliser p:ajax à condition de bien faire le update du composant car si ce dernier se trouve dans le même formulaire

    tu utilises juste l'id sinon tu utilises donc le chemin passant par form

    je crois aussi que l'attribut event est important et actionListener pour l'action à effectuer

  12. #12
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    Ce n'était pas le composant ajax qui posait problème mais le <c:choose>... En l'enlevant ça fonctionne.

  13. #13
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    et tu geres tes visibilités comment?
    car quand j´applique ton code en enlevant le choose, les deux criteres sont affichés.
    Merci

  14. #14
    Membre averti
    Inscrit en
    Juin 2012
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 42
    Par défaut
    J'ai gardé mon composant ajax qui gère le switch entre mes critères et j'ai remplacé le choose en utilisant un renderer.

  15. #15
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    Ah ok.
    Merci de ta reponse.

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

Discussions similaires

  1. [AJAX] problème avec readyState
    Par Booyakha dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/04/2006, 16h52
  2. [AJAX] probleme avec innerhtml
    Par GTJuanpablo dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 19/03/2006, 13h21
  3. AJAX : Problème avec les accents...
    Par @drien dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 29/01/2006, 14h33
  4. [AJAX] Problèmes avec les caractères accentués
    Par marti dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 26/10/2005, 14h10

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