我已经学习了几个星期的Spring,所以我不知道在处理某些问题时要使用的“逻辑”。
我立即告诉你,我的问题不是如何检查2个表单字段是否匹配!我只是用邮件和confirmMail做个例子。
我知道如何通过在对象上使用@Valid
注释来处理表单错误,但是如果表单包含我的类没有的字段会怎么样?
假设有一个注册表单:我有一个名为User的类,包含姓名,年龄和电子邮件字段。使用
处理错误没问题<form:errors path="name" cssClass="error">
<form:errors path="age" cssClass="error">
<form:errors path="mail" cssClass="error">
现在假设我想在我的表单中添加另一个字段,例如confirmEmail,以检查服务器端电子邮件是否正确。我应该怎么处理?我无法在我的类User中创建另一个名为confirmEmail的字段,对我来说这听起来不对。
这是我的表格
<form:form action="signUpSent" method="post" commandName="utente">
<form:input path="nome"/>
<form:errors path="nome" cssClass="DivErroriSpring"/>
<form:input path="cognome"/>
<form:errors path="cognome" cssClass="DivErroriSpring"/>
<form:input path="email"/>
<form:errors path="email" cssClass="DivErroriSpring"/>
<form:input path="confermaEmail"/>
<form:errors path="confermaEmail" cssClass="DivErroriSpring"/>
<input type="submit">
</form:form>
这是我的班级用户(Utente in italian)
public class Utente {
@NotEmpty
@Size(min=3,max=20)
private String nome;
@NotEmpty
@NotNull
@Size(min=3,max=20)
private String cognome;
@NotEmpty
@Email
private String email;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
正如你所看到的,在我的班级用户(Utente in italian)中我没有名为confirmMail的字段(意大利语中的confermaEmail),因为拥有它是不正确的,是吗?
更清楚的是,问题是:当表单字段与我的类User的字段不匹配时,我应该如何处理错误?
答案 0 :(得分:0)
我看到了两种可能的解决方案(除了在User
对象中添加附加字段之外)。
第一种方法是将您的网络层视为与业务领域不同的问题域(有界上下文)。通常,您希望在屏幕上显示/使用的内容与您在应用程序的业务部分中实际需要的内容不匹配。
@FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match")
public class UserForm {
private String email;
private String confirmEmail;
...
}
在您的控制器中,如果验证有效,则将所需字段复制到User
对象(可能使用映射器框架liker Dozer或MapStruct)
第二个是为确认电子邮件添加输入字段,将该字段作为@RequestParam
添加到方法签名中,并在控制器中进行手动验证。您只需向BindingResult
添加错误。
public String register(@Valid @ModelAttribute User user, BindingResult result, @RequestParam("confirmEmail", required=false) String confirmEmail) {
if (!StringUtils.equals(confirmEmail, user.getEmail()) {
result.reject("email", "email.confirm.mustequal");
}
....
}