スプリングMVCフォーム:エラーが表示されません
-
27-09-2019 - |
質問
この質問が以前に尋ねられた場合はお詫びします。誰かが介入して、私のフォーム検証エラーが表示されない理由を理解するのを手伝ってくれることを願っています。
Spring 3.0.3とHibernateを使用しており、JSR-303検証を使用してフォーム入力を検証しています。 SpringのフォームTaglibの助けを借りて作成されたフォームを含むページの取得を処理するスプリングコントローラーがあります。この形式では、ユーザーは名前を変更し、データベースに保存することができます。入力のいずれかが空の場合、フォームのあるページをエラーメッセージで再度表示する必要があります。同じコントローラーがページの送信を処理します。コントローラーはほとんどの点で適切に機能しているようですが、ユーザーの送信フォームにエラーがある場合、ページにエラーは表示されません。
これがどのような形ですか:
<form:form commandName="changeNameCommand">
<form:errors path="*" cssClass="errorBox" />
<table width="100%" border="0" cellspacing="5" cellpadding="5" align="left">
<tr>
<td><b>First Name:</b></td>
<td><form:input path="firstName" value="${user.firstName}" /></td>
</tr>
<tr>
<td><b>Last Name:</b></td>
<td> <form:input path="lastName" value="${user.lastName}" /></td>
</tr>
</table>
</form:form>
ビューには、ユーザーの現在の最初の名前と姓をフォームに入力するために使用されるユーザーオブジェクトがあることに注意してください。これは適切に機能しています。
コントローラーは次のようになります:
@Controller
@RequestMapping(value = "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {
@ModelAttribute("changeNameCommand")
public ChangeNameCommand getCommand() {
return new ChangeNameCommand();
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getChangeNamePage(HttpServletRequest req) {
ModelAndView mav = new ModelAndView("Account.ChangeName");
mav.addObject("page_title", "Change Name");
return mav;
}
@RequestMapping(method = RequestMethod.POST)
public String doChangeName(
@ModelAttribute("changeNameCommand")
@Valid ChangeNameCommand command,
BindingResult result, SessionStatus status) {
if (result.hasErrors()) {
return "redirect:/account/settings/change-name";
}
// Code here to persist updated user first and last name to database...
status.setComplete();
return "redirect:/home";
}
}
私は使用しています タイル2.1.2 ページを作成するには Urlrewrite 3.1.0 フレンドリーなURLを形成するのに役立ちます。
changenamecommandクラスは次のようになります:
import org.hibernate.validator.constraints.NotEmpty;
public class ChangeNameCommand {
@NotEmpty(message = "You must provide a first name.")
private String firstName;
@NotEmpty(message = "You must provide a last name.")
private String lastName;
@NotEmpty(message = "Your password is required to make changes.")
private String currentPassword;
// Getters and setters here...
}
デバッグするとき、最初の名前または姓のいずれにも入力がない場合、BindingResultインスタンスにはエラーが含まれていることがわかります。私の懸念は、エラーがある場合のリダイレクトです。 Redirect:Prefixを使用する代わりに、ビュー名を返すだけの他の質問を見てきました。私はそれを試しましたが、(私は)Urlrewriteを使用する方法と、サーブレットマッピングのセットアップ方法がスプリングがエラーを返すためです。戻ってみました
/account/settings/change-name
/web/account/settings/change-name
/mywebsite/web/account/settings/change-name
しかし、役に立たない。 fwiw、これが私のサーブレットマッピングです:
<servlet-mapping>
<servlet-name>mywebsite</servlet-name>
<url-pattern>/web/*</url-pattern>
</servlet-mapping>
どんな助けも感謝します!
解決 2
これが私の問題を解決した方法です。まず、urlrewritefilterとタイルの使用を落としたくありませんでした。しかし、これの問題は、エラーの場合、コントローラーに示されているように、パスを返すことができなかったことでした。 RequestMapping
注釈。以下は私のソリューションで、エラーの場合にリダイレクトが削除されました。 doChangeName()
.
@Controller
@RequestMapping(value = "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {
@ModelAttribute("changeNameCommand")
public ChangeNameCommand getCommand() {
return new ChangeNameCommand();
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getChangeNamePage() {
ModelAndView mav = new ModelAndView("Account.ChangeName");
mav.addObject("page_title", "Change Name");
return mav;
}
@RequestMapping(method = RequestMethod.POST)
public ModelAndView doChangeName(@ModelAttribute("changeNameCommand") @Valid ChangeNameCommand command,
BindingResult result, SessionStatus status) {
if (result.hasErrors
ModelAndView mav = new ModelAndView("Account.ChangeName");
mav.addObject("page_title", "Change Name");
return mav;
}
// Code here to persist updated user first and last name to database...
status.setComplete();
RedirectView view = new RedirectView("/home");
return new ModelAndView(view);
}
}
これについて私を助けてくれたすべての人に感謝します!
他のヒント
使用 redirect
すべての要求属性(エラーとモデル全体を含む)を消滅させます。したがって、リダイレクトを使用したり、セッションを使用してデータを一時的に保存したり、会話を使用したりしないでください。または、フラッシュスコープのようなものを使用する方法を理解してください(私はしばらくしています)
別のこと - 使用 UrlRewriteFilter
Spring-MVCを使用すると、 Spring-MVCのみを備えたBeatuful RestのようなURLを完全に制御できます。