2012-03-23 2 views
2

を表示することはできません:新しいユーザーのJSP入力では、私がビジネスモデルでクラスを持っているエラーメッセージの後に失敗したSpring MVCのフォーム検証

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 

は、春のフォームを経由して行われます。ここ

<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:検証は、クラス[com.antonbankingに失敗しました。グループの持続時間中に[business.User]

私は間違いの検証エラーメッセージを取得するのですか? BTW full code is available in github

+0

詳細なスタックトレースを教えてもらえますか? – bvulaj

+0

http://dl.dropbox.com/u/25516021/StackTrace.txt - IntinBinderの部分のコメントが外された場合のスタックトレース – edrozim

答えて

0

キャッチ例外はMainService.AddUser(user);であり、catch節ではBindingResultオブジェクトにエラーを追加したりリダイレクトしたりします。問題はAdminServlet.AddUserの復帰にあった -

BindingResult (addError or reject* from Errors)

+0

私はこの2つの場所でConstraintViolationExceptionをキャッチするように私にあなたの提案を実装しようとしました: 1. Hibernateのレベル実際に例外が開いたセッションを閉じてしまう(HibernateExceptionがキャッチされないため) 2.それを再スローして 'MainService.AddUser(user) 'で再びキャッチした後 しかし、もう1つ - http://dl.dropbox.com/u/25516021/Error2.txt 一般的に私はこれが良い方法だとは思わない - 2つの場所で同じ例外をキャッチする。 – edrozim

+0

また、あなたが与えているリンク(私は既にこの1つを読んでいます - 注釈無しでの検証)私はConstraintViolationExceptionをキャッチする必要があるときには何も例を見つけません... – edrozim

+0

例外を捕まえて再スローするのではなく、あなたのコントローラから例外(RuntimeExceptionを拡張します)... – Aure77

4

Validation (without annotation)は私が自分で問題を解決も参照してくださいを参照してください。 "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; 
    } 

にすべてが正しい作業を開始します。

関連する問題