关于Java:Spring MVC表单验证失败后无法显示错误消息

Can't show error message after failed spring mvc form validation

我在商业模式上上课了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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形式发生:

1
2
3
4
5
6
7
8
9
10
11
12
<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的控制器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@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正确进行。但是控制器只是重新加载页面,我看不到任何类型的错误消息。

如果我取消注释控制器中关于UserValidatorInitBinder的代码,我将得到错误,但不是<form:errors path="*" />中的文本,而是Java异常

javax.validation.ConstraintViolationException: validation failed for classes [com.antonbanking.business.User] during persist time for groups [javax.validation.groups.Default, ]

问题是我仅获得验证错误消息时做错了什么? BTW的完整代码可在github中找到。


我自己解决问题-问题是AdminServlet.AddUser的回报。因为我做了"redirect:/",这导致创建包括BindingResult在内的全新对象,因此有关错误的所有信息都被删除了。
更改后

1
2
3
4
5
6
7
    @RequestMapping(value ="/AddUser", method = RequestMethod.POST)
    public String AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
    {
        if (!result.hasErrors())
            MainService.AddUser(user);
        return"redirect:/";
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    @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;
    }

所有开始正常工作。


MainService.AddUser(user);周围和catch子句中的catch异常将错误添加到BindingResult对象或重定向中。

请参见BindingResult(来自Errors的addError或reject *)
另请参见验证(无注释)