Проверьте, изменилась ли форма - PullRequest
8 голосов
/ 20 апреля 2011

Я пишу валидатор, который должен проверить, изменился ли объект формы пружины.

В валидаторе, если в форму не было внесено никаких изменений, должна отображаться ошибка.

Есть ли пружинный механизм для этого?

Это связано с тем, что при отправке делается очень дорогой вызов обновления веб-службы, и мне нужно запретить выполнение вызова веб-службы, если не было внесено никаких изменений.

Приветствие.

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Я не знаю ни одного встроенного механизма Spring, чтобы справиться с этим. Я бы сохранил копию оригинального объекта и модифицированного объекта. Я бы переопределил метод Form.equals () соответствующим образом (возможно, делегируя org.apache.commons.lang.builder.EqualsBuilder.reflectionEquals (), если все поля являются примитивами / строками), и использовал бы Form.equals () для проверьте, изменилась ли форма.

Я видел два разных ответа, которые подразумевают, что переопределение метода "hashCode" - хороший путь. Это не входит в контракт hashCode (), чтобы гарантировать неравенство, это может привести к проблемам. Обязательно переопределите equals (). Конечно, вероятность столкновения хэшей составляет один триллион, но плохой дизайн полагаться только на hashCode (), когда вы пытаетесь проверить, отличаются ли два объекта.

1 голос
/ 21 апреля 2011

Переопределите функцию hashCode (), чтобы гарантировать, что при изменении значений формы будет возвращено другое значение. Сохраните возвращаемое значение функции и проверьте, изменилось ли оно.

public class Person {
  String first;
  String last;
  int prevHash;
  @Override
  public int hashCode() {
    // does not include the value of currHash
    String stringHash = String.format("%1$-29s%2$-29s", first,last);
    return stringHash.hashCode();
  }
}

public class PersonValidator  implements Validator {
  public void validate(Object obj, Errors e) {
    Person p = (Person) obj;
    if (p.hashCode() == p.getPrevHash()) {
      e.reject("person", "unchanged");
    } 
  }
  ...
}

Я не думаю, что существует проверочный тест, предоставленный Spring, чтобы проверить, изменился ли объект поддержки формы

Обратите внимание, что вы можете выполнить дополнительные тесты на стороне клиента, прежде чем разрешить пользователю отправить форму.

0 голосов
/ 04 июня 2015

Попробуйте другой подход, основанный на проверке на стороне клиента, изменилась ли форма. Пользовательский интерфейс стартовой формы / jQuery:

   $(document).ready(function() {
        var isFormChanged = false;
        var isConfirmed = false;
        $("form :input").change(function() {
            console.log($(this).attr('name'));
            isFormChanged = true;
        });

        $("#storeForm").submit(function(event) {
            if (!isConfirmed) {
                event.preventDefault();
            }
            if (isFormChanged) {
                console.log("Form has changed");
                $(":submit").addClass("btn-danger");
                $(":submit").text("Confirm");
                isConfirmed = true;
            }
        });
    });

Вы также можете создать скрытое поле в форме, чтобы отправлять информацию обратно в Spring для проверки всех этих данных на стороне сервера. Это быстрее, чем отправить все данные формы на сервер, чтобы проверить, не изменилось ли что-нибудь каждый раз.

...