二つの項目を比較する


ガイド*1を参考にしたのだが、コンパイルが通らない。

public static boolean validateTwoFields(
    Object bean,
    ValidatorAction va, 
    Field field,
    ActionErrors errors,
    HttpServletRequest request, 
    ServletContext application) {

    String value = ValidatorUtils.getValueAsString(
        bean, 
        field.getProperty());
    String sProperty2 = field.getVarValue("secondProperty");
    String value2 = ValidatorUtils.getValueAsString(
        bean, 
        sProperty2);

    if (!GenericValidator.isBlankOrNull(value)) {
       try {
          if (!value.equals(value2)) {
             errors.add(field.getKey(),
                Resources.getActionError(
                    application,
                    request,
                    va,
                    field));

             return false;
          }
       } catch (Exception e) {
             errors.add(field.getKey(),
                Resources.getActionError(
                    application,
                    request,
                    va,
                    field));
             return false;
       }
    }

    return true;
}


さらに参考として張ってあったリンク先*2もアウト。

public static boolean validateTwoFields(Object bean, ValidatorAction va,
                                        Field field, ActionErrors errors,
                                        HttpServletRequest request) {
    String value =
        ValidatorUtil.getValueAsString(bean, field.getProperty());
    String sProperty2 = field.getVarValue("secondProperty");
    String value2 = ValidatorUtil.getValueAsString(bean, sProperty2);

    if (!GenericValidator.isBlankOrNull(value)) {
        try {
            if (!value.equals(value2)) {
                errors.add(field.getKey(),
                           Resources.getActionError(request, va, field));

                return false;
            }
        } catch (Exception e) {
            errors.add(field.getKey(),
                       Resources.getActionError(request, va, field));

            return false;
        }
    }

    return true;
}


ActionErrorsへのsetはもう使ってはいけないので、ActionMessagesを使用する。

public static boolean validateTwoFields(Object bean, ValidatorAction va, Field field, ActionMessages messages, HttpServletRequest request) {
  String value = ValidatorUtils.getValueAsString(bean, field.getProperty());
  String sProperty2 = field.getVarValue("secondProperty");
  String value2 = ValidatorUtils.getValueAsString(bean, sProperty2);

  if (!GenericValidator.isBlankOrNull(value)) {
    try {
      if (!value.equals(value2)) {
        messages.add(field.getKey(),
              Resources.getActionMessage(request, va, field));

          return false;
      }
    } catch (Exception e) {
      messages.add(field.getKey(),
          Resources.getActionMessage(request, va, field));
  
      return false;
    }
  }
  
  return true;
}


カスタムルールの定義を変更するのも忘れずに。