2016-03-28 7 views
-1

私のアプリケーションで既存のユーザオブジェクトを編集するときに問題があります。まず、次のメソッドを提供するコントローラクラスがあります。Spring MVC - 既存のオブジェクトを編集するときの重複値

@Transactional 
@RequestMapping(value = "/edit", method = RequestMethod.GET) 
public ModelAndView editUser(HttpServletRequest request) { 
    String eMail = request.getParameter("email"); 
    User user = userDao.findUserByEMail(eMail); 

    ModelAndView model = new ModelAndView("UserForm"); 
    model.addObject("user", user); 
    return model; 
} 

@Transactional 
@RequestMapping(value = "/edit", method = RequestMethod.POST) 
public ModelAndView saveEditUser(@Valid User user, BindingResult result) { 
    System.out.println(user); 
    if (result.hasErrors()) { 
     return new ModelAndView("redirect:/"); 
    } 

    userDao.saveOrUpdate(user); 
    return new ModelAndView("redirect:/"); 
} 

私は2つのJSPファイルを持っています。最初のものはすべてのユーザー(データベースに格納されている)を表示し、既存のユーザーを編集する機会を提供します(新しいユーザーを追加する場合は同じJSP)。ユーザを編集した後

UserList.jsp

<div align="center"> 
    <h1>Users List</h1> 
    <h2> 
     <a href="<c:url value='/new'/>">New User</a> 
    </h2> 

    <table border="1"> 
     <th>No</th> 
     <th>Forename</th> 
     <th>Surname</th> 
     <th>Birthdate</th> 
     <th>E-Mail</th> 
     <th>Actions</th> 

     <c:forEach var="user" items="${userList}" varStatus="status"> 
      <tr> 
       <td>${status.index + 1}</td> 
       <td>${user.forename}</td> 
       <td>${user.surname}</td> 
       <td>${user.birthdate}</td> 
       <td>${user.email}</td> 
       <td><a href="<c:url value='/edit?email=${user.email}'/>">Edit</a> 
        &nbsp;&nbsp;&nbsp;&nbsp; <a href="<c:url value='/delete?email=${user.email}'/>">Delete</a> 
       </td> 
      </tr> 
     </c:forEach> 
    </table> 
</div> 

UserForm.jsp

<div align="center"> 
    <h1>New/Edit User</h1> 
    <table> 
     <form:form method="post" modelAttribute="user"> 
      <form:hidden path="id" id="id" /> 
      <tr> 
       <td>Forename:</td> 
       <td><form:input path="forename" id="forename" /></td> 
      </tr> 
      <tr> 
       <td>Surname:</td> 
       <td><form:input path="surname" id="surname" /></td> 
      </tr> 
      <tr> 
       <td>Birthdate:</td> 
       <td><form:input path="birthdate" id="birthdate" /></td> 
      </tr> 
      <tr> 
       <td>E-Mail:</td> 
       <td><form:input path="email" id="email" /></td> 
      </tr> 
      <tr> 
       <td colspan="2" align="center"><input type="submit" 
        value="Save"></td> 
      </tr> 
     </form:form> 
    </table> 
</div> 

<br /> 
<br /> Go back to 
<a href="<c:url value='/listUsers' />">List of all users</a> 

、ユーザのmail属性が同じ値をもう一度含まなぜか分からない。例えば、私はUserAUserからユーザーのsurnameを変更したいと私はエラーメッセージを得た:

org.springframework.validation.BeanPropertyBindingResult:1つのエラー

フィールドエラーオブジェクト内の「ユーザー」をフィールド 'メール'に:拒否された値 [test @ user.com、test @ user.com];コード [Email.user.email、Email.email、Email.java.lang.String、Email];引数 [org.springframework.context.support.DefaultMessageSourceResolvable: コード[user.email、email];引数[];デフォルトのメッセージ [email]、[Ljavax.validation.constraints.Pattern $ Flag; @ 653e5537、。*]; デフォルトのメッセージは、私はそれが起こると、あなたが私を助けることができる場合、私は嬉しくなる理由は分からない

[有効なメールアドレスを入力してください]。

答えて

1

/edit?email=...が呼び出されたときにeditUserメソッドが呼び出されます。このメソッドは、ファイルUserForm.jspに定義されているビューをロードします。 JSPファイルにはHTML formタグが含まれていますが、フォームタグのaction属性は設定されていません。したがって、フォームは、フォームをロードした同じURL(/edit?email=...)に送信されます。

このフォームには、emailというフィールドがあります。このフィールドはフォームとともに送信されます。これは、モデルオブジェクトで同じ電子メールアドレスを2回取得する理由です。

電子メールアドレスを編集可能にしたくない場合は、inputフォームフィールドの代わりにテキストラベルを使用できます。電子メールアドレスを編集可能にする場合は、URLパラメータの名前をemail以外に変更します。

+0

ありがとうございました!私は '/ edit?email = ...'を '/ edit?usermail = ...'に変更しました。あなたは私をたくさん助けました。 – DarkwingBug

関連する問題