つかれた。過去 2 週間、Spring MVC のサイド プロジェクトに取り組んできましたが、ドキュメンテーションがせいぜい誤解を招くものであることがわかりました。すっごい.....助けてください!
質問
私が理解しようとしているのは、以下の設定で検証エラーがビューに返されない理由です。つまり、さまざまなfrm:error(s)
タグにエラーが表示されていません。実行時デバッグを介して BindingResult 引数を POST リクエスト マッピングにチェックしたところ、エラーが表示されました。これに関するドキュメントがせいぜい曖昧であることを考えると、セミコロンの置き忘れを指摘したり、検証エラーをユーザーに通知して個人的な不備を知らせるために欠落している秘密のソースが何であるかを教えてもらえますか?
おまけとして、誰かが自動列挙型検証を変更して、メッセージ バンドルから独自の検証エラー メッセージを追加できるようにする方法を知っていれば、私は大変助かります。
この純粋な Spring MVC 3.0 を維持しようとしていることに注意してください。私は 2.5.6 をかなり使いこなせましたが、アノテーションはほとんど使用していませんでした。そのため、このプロジェクトは他の何よりも学習課題です。純粋に 3.0 アノテーションなどを使用したいと思いますが、夢の中で私を嘲笑し、コマンドオブジェクトを捨てて、HttpServletRequest を唯一の RequestMapping 引数として設定し、完了したドキュメントに脳が反抗しているにもかかわらずです。それと。
スタック:
春 3.0.6
タイル 2.2.2
Glassfish 3.1.1
コード:
Spring app-servlet.xml
<context:component-scan base-package="com.facets.w101.almanac.spring"/>
<mvc:annotation-driven/>
... other stuff
春の main.beandef.xml
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="messages" />
<bean id="userValidator" class="com.mycmpny.UserValidator" />
... other stuff
コントローラーコード
@Resource(name="userValidator")
private UserValidator userVldr;
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setValidator(this.userVldr);
}
@RequestMapping(value = "/newuser", method = RequestMethod.GET)
public String newUserSetup(ModelMap model) {
model.addAttribute("newUser", new User());
return "newuser";
}
@RequestMapping(value = "/newuser", method = RequestMethod.POST)
public ModelAndView newUserSave(@ModelAttribute @Valid User user, BindingResult result) {
ModelAndView mav = new ModelAndView("newuser");
mav.addObject("newUser", user);
if(result.hasErrors()) {
return mav;
}
/* Code that saves user */
return mav;
}
JSP コード
<frm:form method="POST" commandName="newUser">
<frm:errors path="*" cssClass="errorblock" element="div" />
<frm:label path="name">Name:</frm:label>
<frm:input path="name" id="userName" /><frm:errors path="name" /></td>
<frm:label path="type">User Type:</frm:label>
<frm:select path="type">
<frm:option value="-" label="Please Select..."/>
<frm:options />
</frm:select><frm:errors path="type" />
ノート
- ドキュメント
<mvc:annotation-driven validator="userValidator"/>
に従って userValidator をグローバルにするために Spring 構成ファイルで使用しようとしましたが、何らかの理由でユーザーバリデーターが見つからず、読み込まれず、使用されませんでした。とファイルで構成しようとしましたが、うまくいきません。そこで、@InitBinder スキームに頼りました。[appname]-servlet.xml
main.beandef.xml
- どうやら、リクエスト マッピングにメソッド引数が含まれていない場合、
BindingResult result
検証全体が失敗し、注釈付きのリクエスト メソッドに戻る代わりに、検証エラーを含む例外がスローされ、Spring はブラウザーを 404 ページに送ろうとします。引数として BindingResult (またはおそらく他のスプリング オブジェクト) を持たなければならないことは (今では完全に!) 文書化されていません。 - 列挙型。
frm:select
コマンド オブジェクトの enum データ メンバーに spring タグを使用し、属性のない<frm:options />
子タグを追加すると、Spring は値とテキストが enum の値に設定されたオプションをドロップダウン選択に自動的に入力しgetName
ます。カスタム リソース バンドル メッセージを関連付ける方法をまだ見つけていません。とにかく、この機能は完全に文書化されていません。