code: protected void validateValue(FacesContext context, Object value) {
  
          // Skip validation if it is not necessary
          super.validateValue(context, value);
  
          if (!isValid() || (value == null)) {
              return;
          }
  
          // Ensure that the value matches one of the available options
          boolean found = SelectUtils.matchValue(getFacesContext(),
                                                 this,
                                                 value,
                                                 new SelectItemsIterator(context, this),
                                                 getConverter());
  
          boolean isNoSelection = SelectUtils.valueIsNoSelectionOption(getFacesContext(),
                                                 this,
                                                 value,
                                                 new SelectItemsIterator(context, this),
                                                 getConverter());
  
          // Enqueue an error message if an invalid value was specified
          if ((!found) || 
              (isRequired() && isNoSelection)) {
              FacesMessage message =
                  MessageFactory.getMessage(context, INVALID_MESSAGE_ID,
                       MessageFactory.getLabel(context, this));
              context.addMessage(getClientId(context), message);
              setValid(false);
          }
          
      }
docs: <p><span class="changed_modified_2_0">In</span> addition to the
  standard validation behavior inherited from {@link UIInput},
  ensure that any specified value is equal to one of the available
  options.  Before comparing each option, coerce the option value
  type to the type of this component's value following the
  Expression Language coercion rules.  If the specified value is
  not equal to any of the options, enqueue an error message and set
  the <code>valid</code> property to <code>false</code>.</p>
  
  <p class="changed_added_2_0">If {@link #isRequired} returns
  <code>true</code>, and the current value is equal to the value of
  an inner {@link UISelectItem} whose {@link
  UISelectItem#isNoSelectionOption} method returns
  <code>true</code>, enqueue an error message and set the
  <code>valid</code> property to <code>false</code>.</p>
  
  @param context The {@link FacesContext} for the current request
  
  @param value The converted value to test for membership.
  
  @throws NullPointerException if <code>context</code>
  is <code>null</code>