3 Replies Latest reply on Feb 25, 2010 3:47 PM by Kurt Bliefernich

    Custom Converter

    Pieter Bosman Newbie


      please bear in mind that I'm a newbie towards both JSF/Facelets and Seam.

      I'm a bit puzzled towards the usage of Converters.
      A short description of what is sure to be a recognizable situation for many of you.

      I got my own 'user.java' bean, with a 'name', 'firstname', 'login', 'password' etc... The basic user bean.

      I wish to create a selectOneMenu where the entries in the dropdown are based on the users in my database.
      I'm perfectly capable of getting the list of users into my webapp, but I'm at a complete loss as how to show the users in my selectOneMenu.

      What I wish is for my selectOneMenu to show as entries the string(s) that are composed of the firstname and lastname of each of my users that I get from the list in the database.

      I've been searching google for hours, perhaps I'm searching with wrong/bad parameters but I'm ready to throw in the towel...

      Anyone able to point me in the right direction?


        • 1. Re: Custom Converter
          Tanya Ruttenberg Expert

          Hi Pieter I'm in exactly the same boat as you are, however, I am starting to get a glimmer of understanding regarding custom converters.

          My dilemma is I wish to use a richfaces comboBox instead of a selectOneMenu.

          BTW -- as I'm writing this it occurs to me that you don't need a converter if you are using selectOneMenu. You can use s:selectItems to display values and labels based on your database query.

          Here is some code I used to display a selectOneMenu containing entries that look like this

          AK (Alaska)
          AL (Alabama)

          But the value that gets input is simply the 2 character abbreviation, ie AK or AL

          <h:selectOneMenu value="#{office.state}">
            <s:selectItems noSelectionLabel=" "
              value="#{statesList.stateNames}" var="_state"
              label="#{_state[0]} (#{_state[1]})"
              itemValue="#{_state[0]}" />

          Let me know if you need more details.  The basic is that what you display is the value of label and what you input is the value of itemValue.


          • 2. Re: Custom Converter
            Konstantin Larionov Newbie

            Either use <s:convertEntity> (see section of the Seam documentation) or write your own converter (section 33.2 of the Seam documentation).

            • 3. Re: Custom Converter
              Kurt Bliefernich Newbie

              You can use s:convertEntity like so

              <h:selectOneMenu value="#{someBean.user}" id="utoL"  >
                   <s:selectItems value="#{userBean.users}" 
                         label="#{user.firstname} #{user.lastName}"

              If you use s:convertEntity you have to over ride the equals and hashcode methods of you entity.  It can be something as simple as :

              public boolean equals(Object obj) {
                  boolean equals = false;
                  if (obj != null
                      && obj instanceof User
                      && ((User) obj).userId == this.userId) {
                      equals = true;
                  return equals;