このオブジェクトを休止状態で保存する前に、オブジェクトを事前入力するためのベストプラクティスは何ですか?
私がしたこと:
私のコントローラー:
//The Form
@RequestMapping(value = "user/{id}/edit", method = RequestMethod.GET)
public String edit(@PathVariable("id") Long userId, ModelMap modelMap) {
modelMap.addAttribute("user", userService.find(userId));
return "user/userEdit";
}
//Updating database
@RequestMapping(value = "user/edit", method = RequestMethod.POST)
public String update(@ModelAttribute("user") @Valid User user, BindingResult result,
RedirectAttributes redirectAttrs) {
if (result.hasErrors()) {
return "user/userEdit";
}else{
userService.update(user);
redirectAttrs.addFlashAttribute("message", "Success");
return "redirect:user/userEdit";
}
}
すべてのフィールド(ユーザー名、パスワード、ID)を含むフォームを作成すると機能しますが、ユーザーにパスワードのみを更新させたい場合はどうすればよいですか?
ユーザー名に@NotEmptyがあるので、ユーザー名がnullであるというエラーが表示されます。これは、フォームにないためですが、ユーザー名フィールドは入力せず、パスワードだけを入力します。
私のhtmlフォーム:
<c:url var="url" value="/user/edit" />
<form:form method="post" action="${url}" modelAttribute="user" class="form-horizontal">
<form:hidden path="id"/>
<form:hidden path="version"/>
<fieldset>
<div class="control-group">
<form:label cssClass="control-label" path="password"><spring:message code="user.label.password"/>: </form:label>
<div class="controls">
<form:input cssClass="input-xlarge" path="password" />
</div>
<form:errors path="password"/>
</div>
<div class="control-group">
<form:label cssClass="control-label" path="userRole"><spring:message code="user.label.role"/>: </form:label>
<div class="controls">
<form:select path="userRole">
<form:options items="${userRoleList}" itemValue="id" itemLabel="name"/>
</form:select>
</div>
<form:errors path="userRole"/>
</div>
<div class="control-group">
<form:label cssClass="control-label" path="costumer.id"><spring:message code="user.label.costumer"/>: </form:label>
<div class="controls">
<form:select path="costumer.id">
<form:options items="${costumerList}" itemValue="id" itemLabel="name"/>
</form:select>
</div>
<form:errors path="costumer.id"/>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">Save changes</button>
<a class="btn cancel link" href="<c:url value="/user" />">Cancel</a>
</div>
</fieldset>
</form:form>
- @Sessionattributesを使用してみましたが、ブラウザのタブを使用して2人以上のユーザーを編集しようとするとうまくいきません。
- プロパティエディタを使用してみましたが、@ModelAtrributeユーザーユーザーでは機能しませんでした。
- コンバーターを使ってみましたが、うまくいきませんでした。
最初にUseruser= userService.find(id)を作成してから、更新された値を設定する唯一の方法はありますか?何かのようなもの:
@RequestMapping(value = "user/edit", method = RequestMethod.POST)
public String update(@RequestParam("password") String password, BindingResult result, RedirectAttributes redirectAttrs) {
User user = userService.find(id);
if (password == null{
return "user/userEdit";
}else{
user.setPassword("password");
userService.update(user);
redirectAttrs.addFlashAttribute("message", "Success");
return "redirect:user/userEdit";
}
}
検証がないので、これは間違っているように見えます。