簡體   English   中英

失敗的Spring MVC表單驗證后無法顯示錯誤消息

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

我在商業模式上上課:

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
@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:在組[javax.validation.groups.Default,]的持續時間內,對類[com.antonbanking.business.User]的驗證失敗

問題是我收到驗證錯誤消息后做錯了什么? BTW的完整代碼可以在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;
    }

一切都開始正常工作。

MainService.AddUser(user);周圍捕獲異常MainService.AddUser(user); 並在catch子句中將錯誤添加到BindingResult對象或重定向。

請參見BindingResult(錯誤中的addError或reject *)。另請參見驗證(無注釋)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM