1

ここでは3.1.1を使用しています。

これは正常に機能し、フォームは正しく表示されます

@RequestMapping(value={"/universities"}, params="new", method=RequestMethod.GET)
public String addUniversity(Model model) {
    model.addAttribute("addForm", AddForm.newUniversity());
    return "page/add-university";
}

検証エラーをテストすると(フィールドを空にすることで)、500の内部サーバーエラーが発生し、スタックトレースがメインメッセージとともに表示されます: BindingResultもBean名'addForm'のプレーンターゲットオブジェクトもリクエスト属性として使用できません

これは方法です:

@RequestMapping(value={"/universities"}, method=RequestMethod.POST)
public String submitNewUniversity(@Valid AddForm form, BindingResult binding) {
    if (binding.hasErrors()) {
        return "page/add-university";
    }

    // do others here ...
}

これが私のJSPです:

<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="t" uri="http://tiles.apache.org/tags-tiles" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" 
    session="false" %>

<s:url var="action" value="/universities" />
<sf:form method="POST" modelAttribute="addForm" action="${action}">         
   <fieldset> 
   <table cellspacing="0">
      <tr>
         <th><sf:label path="name">University:</sf:label></th>
         <td><sf:input path="name" size="30" /> <br/>
             <sf:errors path="name" cssClass="error" />
         </td>
      </tr>
      .....
</sf:form>

これまで私が研究したのはこれらです:

  • コントローラとJSPタイルの両方で、Bean名は正しいです。これは「addForm」です。
  • フォームの表示は正常に機能するため、ビューが存在します。
  • フォームの表示は正常に機能するため、JSPのフィールド名も正しいです。
  • パラメータの順序は問題ありません。BindingResultはコマンドBeanに従います。
  • 私が追加したログの出力によってsubmitNewUniversityが呼び出されると確信しています

私はここで何を間違えたのだろうか?

4

1 に答える 1

1

それを見つけた !

から変えました

@Valid AddForm form

@Valid @ModelAttribute("addForm") AddForm form

これはうまくいきますが、注釈を削除して、フォーム名をリクエスト属性と同じ変数名に変更しようとしました:

@Valid AddForm addForm

これでも同じエラーがスローされます。

これからは @ModelAttribute に固執する必要があると思います。

于 2012-05-05T08:52:35.240 に答える