我正在使用Spring In Action 3rd Action学习Spring MVC ,我已经实现了显示用户注册表单的基本程序,一旦我们提交了表单,它将使用进行验证@Valid
。
这是我的Spring Controller:
@Controller
@RequestMapping("/spitter")
public class SpitterController {
private final SpitterService spitterService;
@Inject
public SpitterController(SpitterService spitterService) {
this.spitterService = spitterService;
}
@RequestMapping(method = RequestMethod.GET, params = "new")
public String createSpitterProfile(Model model) {
Spittle spittle = new Spittle();
model.addAttribute(spittle);
model.addAttribute(new Spitter());
return "spittles/edit";
}
@RequestMapping(method = RequestMethod.POST)
public String addSpitterFromForm(@Valid Spitter spitter,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "spittles/edit";
}
spitterService.saveSpitter(spitter);
return "redirect:/spitter/" + spitter.getUsername();
}
}
这是我的Spitter
课程文件:
package com.habuma.spitter.domain;
import java.util.List;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class Spitter {
private Long id;
@Size(min = 3, max = 20, message = "User name must be between 3 and 20 characters long.")
@Pattern(regexp = "^[a-zA-Z0-9]+$", message = "Username must be alphanumeric with no spaces")
private String username;
@Size(min = 6, max = 20, message = "The password must be atleast 6 characters long.")
private String password;
@Size(min = 3, max = 50, message = "Your full name must be between 3 and 50 characters long.")
private String fullName;
@Pattern(regexp = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}", message = "Invalid email address.")
private String email;
private List<Spittle> spittles;
private boolean updateByEmail;
......Setters & Getters.....
@Override
public boolean equals(Object obj) {
Spitter other = (Spitter) obj;
return other.fullName.equals(fullName)
&& other.username.equals(username)
&& other.password.equals(password);
}
@Override
public int hashCode() {
return super.hashCode();
}
}
这是我的edit.jsp
文件,显示给用户注册:
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<div>
<h2>Create a free Spitter account</h2>
<sf:form method="POST" modelAttribute="spitter" enctype="multipart/form-data">
<fieldset>
<table cellspacing="0">
<tr>
<th><label for="user_full_name">Fullname:</label></th>
<td><sf:input path="fullName" size="15" id="user_full_name" />
<sf:errors path="fullName" cssClass="error" /></td>
</tr>
<tr>
<th><label for="user_screen_name">Username:</label></th>
<td><sf:input path="username" size="15" maxlength="15"
id="user_screen_name" /> <small id="username_msg">No spaces,please.</small>
<sf:errors path="username" cssClass="error" /></td>
</tr>
<tr>
<th><label for="user_password">Password:</label></th>
<td><sf:password path="password" size="30" showPassword="true"
id="user_password" /> <small>6
characters or more (betricky!)</small> <sf:errors path="password"
cssClass="error" /></td>
</tr>
<tr>
<th><label for="user_email">EmailAddress:</label></th>
<td><sf:input path="email" size="30" id="user_email" /> <small>In
case you forget something</small> <sf:errors path="email"
cssClass="error" /></td>
</tr>
<tr>
<th></th>
<td><sf:checkbox path="updateByEmail"
id="user_send_email_newsletter" /> <label
for="user_send_email_newsletter">Send me email updates!</label></td>
</tr>
<tr>
<th><label for="image">Profile image:</label></th>
<td><input name="image" type="file" />
</tr>
<tr>
<th></th>
<td><input name="commit" type="submit"
value="I accept.Createmyaccount." /></td>
</tr>
</table>
</fieldset>
</sf:form>
</div>
要加载表单,我将以:的形式访问URL http://localhost:8081/SpringInAction3/spitter?new
,加载表单后,我只是提交表单而无需输入任何详细信息,以便我可以检查表单是否得到验证。但我得到以下例外:
java.lang.NullPointerException
com.habuma.spitter.domain.Spitter.equals(Spitter.java:87)
org.hibernate.validator.engine.resolver.SingleThreadCachedTraversableResolver$TraversableHolder.equals(SingleThreadCachedTraversableResolver.java:138)
java.util.HashMap.get(HashMap.java:305)
org.hibernate.validator.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:45)
org.hibernate.validator.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:757)
org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:324)
org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForRedefinedDefaultGroup(ValidatorImpl.java:273)
org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:256)
org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:210)
org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:119)
org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:106)
org.springframework.validation.DataBinder.validate(DataBinder.java:760)
我得到NullPointerException
我equals
的方法Splitter
类。请让我知道我在哪里做错了吗?
Edit:
当我尝试打印Spitter对象中字段的值时,所有字段的值都为null,从而导致NullPointerException
。
这次我从类中删除了equals
andhashCode
方法Spitter
,现在当我提交表单时,验证没有发生,并且页面将http://localhost:8081/SpringInAction3/spitter/null
不显示任何错误。
为什么在这种情况下不进行验证?另外,如果我只是按照那本书中的步骤进行操作,那我将得到NullPointerException,这是意外的。请让我知道我在哪里做错了吗?
按照这个SO post:@Valid(jsr 303)在Spring mvc 3.0中不起作用<mvc:annotation-driven/>
,我的配置文件中也有标签。
到目前为止,我看到一个错误。sf:form属性的enctype设置为multipart / form-data,但仅用于文件上传,因此我想spring mvc使用的是MultipartResolver而不是将表单数据绑定到表单支持对象的数据绑定机制,尝试将其更改为application / x-www-form-urlencoded,这是您的案例的默认和正确类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句