java - spring mvc 表单验证失败后无法显示错误消息

标签 java jpa spring-mvc validation bean-validation

我有商业模式类(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/

相关文章:

java - 如何在java中使用newAPIHadoopRDD?

java - 插入到 mongoDB 时检查唯一性

java - 如何设置不同的上下文以指向 webapps Tomcat/Java 之外的外部目录

java - JPA 中的@Any 等价于什么?

java - Spring中使用@Bean的默认bean id是什么?

java - 在android中通过fb登录后无法获取emailId

java - JPA:多态关联和连接表

java - spring mvc Controller 接受具有可变数量的键/值的JSON对象

java - 错误 [org.springframework.web.servlet.DispatcherServlet]

Java EE SqlResultSetMapping 语法