code: @Override
      public void processValidators(FacesContext context) {
          if (context == null) {
              throw new NullPointerException();
          }
  
          // Skip processing if our rendered flag is false
          if (!isRendered()) {
              return;
          }
  
          // we have to override since UIInput assumes that a null value means don't check
          if (getSubmittedValue() == null && myIsRequired()) {
              String requiredMessageStr = getRequiredMessage();
              FacesMessage message;
              if (null != requiredMessageStr) {
                  message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                             requiredMessageStr,
                                             requiredMessageStr);
              } else {
                  message =
                       MessageFactory.getMessage(context, REQUIRED_MESSAGE_ID,
                            MessageFactory.getLabel(
                                 context, this));
              }
              context.addMessage(getClientId(context), message);
              setValid(false);
              context.validationFailed();
              context.renderResponse();
          }
          else {
              super.processValidators(context);
          }
      }
docs: <p class="changed_added_2_0">Specialize superclass behavior to treat
  <code>null</code> differently.  In this class, a <code>null</code> value
  along with the "required" flag being set to <code>true</code> will
  cause a validation failure. </p>
  @param context
  @since 2.0