我有商业模式类(class):
public class User {
@Size(min = 3, max = 20, message = "Username must be between 3 and 20 characters long")
@Pattern(regexp = "^[a-zA-Z0-9]+$", message = "Username must be alphanumeric with no spaces")
@Column(name = "name")
private String name;
@Id
@GeneratedValue
@Column(name = "user_id")
private Long userID;
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "userDic", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "user_id") }, inverseJoinColumns = {
@JoinColumn(name = "acc_id", referencedColumnName = "acc_id") })
@LazyCollection(value = LazyCollectionOption.FALSE)
private Set<Account> allAccounts; //............. //constructors , setters , getters here
在 jsp 中,新用户的输入通过 spring 表单发生:
<form:form method="post" action="AddUser" modelAttribute="user">
<table>
<tr>
<td><form:label path="name">First Name</form:label></td>
<td><form:input path="name" /></td>
<td><form:errors path="*" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Add User" /></td>
</tr>
</table>
</form:form>
这是处理这个 jsp 的 Controller :
@Controller
@SessionAttributes
public class AdminServlet
{
/* private UserValidator validator;
@InitBinder("user")
protected void initBinder(WebDataBinder binder)
{
binder.setValidator(validator);
}*/
@RequestMapping(value = "/")
public ModelAndView showUsers() throws ClassNotFoundException, SQLException
{
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
mav.addObject("ATMUsers", MainService.getAllUsers());
mav.addObject("user", new User());
return mav;
}
@RequestMapping(value = "/AddUser", method = RequestMethod.POST)
public String AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
{
if (!result.hasErrors())
MainService.AddUser(user);
return "redirect:/";
}
}
字段 name
的验证正确发生.但是 Controller 只是重新加载页面,我没有看到任何类型的错误消息。
如果我在 Controller 中取消注释关于 UserValidator
的代码和 InitBinder
我会得到错误,但它不是 <form:errors path="*" />
中的文本, 但 java 异常
javax.validation.ConstraintViolationException: validation failed for classes [com.antonbanking.business.User] during persist time for groups [javax.validation.groups.Default, ]
问题是我做错了什么才得到验证错误消息?顺便说一句 full code is available in github .
最佳答案
我自己解决问题 - 问题是 AdminServlet.AddUser 的返回。因为我制作了 "redirect:/"
这会导致创建包括 BindingResult 在内的全新对象,所以所有关于错误的信息都被删除了。
改变后
@RequestMapping(value = "/AddUser", method = RequestMethod.POST)
public String AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
{
if (!result.hasErrors())
MainService.AddUser(user);
return "redirect:/";
}
到
@RequestMapping(value = "/AddUser", method = RequestMethod.POST)
public ModelAndView AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
{
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
mav.addObject("ATMUsers", MainService.getAllUsers());
if (result.hasErrors())
mav.addObject("user", user);
else
{
mav.addObject("user", new User());
MainService.AddUser(user);
}
return mav;
}
一切开始正常工作。
关于java - spring mvc 表单验证失败后无法显示错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9840771/