我正在编写一个验证器,需要测试弹簧形式对象是否已经改变。
在验证程序中,如果未对表单进行任何更改,则应显示错误。
有弹簧机制吗?
这是因为我提交时会进行非常昂贵的webservice更新调用,如果没有进行任何更改,我需要阻止进行webservice调用。
干杯。
答案 0 :(得分:2)
我不知道有任何内置的Spring机制来处理这个问题。我将保存原始对象和修改对象的副本。我会适当地覆盖Form.equals()方法(可能委托给org.apache.commons.lang.builder.EqualsBuilder.reflectionEquals(),如果所有字段都是基元/字符串)并使用Form.equals()来检查表格是否有变化。
我在这里看到了两个不同的响应,这意味着重写“hashCode”方法是一个很好的方法。它不在hashCode()的合同中来保证不平等,这可能会导致问题。一定要重写equals()。当然,它是哈希冲突的万亿分之一,但是当你试图检查两个对象是否不同时,单独依赖hashCode()的设计很差。
答案 1 :(得分:1)
重写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提供的验证测试来检查表单支持对象是否已更改
请注意,在允许用户提交表单之前,您可以在客户端执行其他测试。
答案 2 :(得分:0)
如果表单已更改,请尝试基于客户端检查的不同方法。 从用户界面/ 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,以便在服务器端再次检查所有这些信息。它比将所有表单数据推回服务器更快,只是为了检查每次都有变化。