2

データベースからのデータが取り込まれるフォームがあります。私の問題の説明を始める前に、いくつかのスニペット:

1 つのクラス:

// @Entity for areas
public class Area {
@Id
@Column(name = "area")
private String area;

@Column(name = "deleted")
private boolean deleted;

getter/setter
}

セカンドクラス

// @Entity for employees
public class Employee {
@Id
@GeneratedValue
@Column(name = "ID")
private long id;

@ManyToOne
@JoinColumn(name = "area")
private Area area;

@Column(name = "name")
private String name;

getter/setter

jsp にデータを返すために呼び出される EmployeeController のメソッド

protected String createDialog( @PathVariable("id") Long id, Model model ){
    Employee employee = id == 0 ? new Employee() : employeeService.findById(id);
    //return employee
    model.addAttribute("employeeModel", employee );
 //add data needed to create dropdown holding areas
    //areaService.findAll returns a List<Area>
    model.addAttribute("areas", areaService.findAll( 
                new Sort( 
                    Sort.Direction.ASC,
                    "area"
                    )
                ));
    return "employees/dialogUpdateEdit";
}

エリアのドロップダウンと、新しい従業員が返されない場合は既知のデータを示す jsp

<form:form action="employees/ajax" commandName="employeeModel" method="POST" id="createForm">
    <table class="fullWidth">
        <tr>
            <td>Area</td>
            <td>
                <form:select path="area" items="${areas}" class="fullWidth">
                </form:select>
            </td>
        </tr>
        <tr>
            <td>Employee Name</td>
            <td><form:input path="name" class="fullWidth"/></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="Save Changes" id="btnSaveEmployee" class="fullWidth" />
            </td>
        </tr>
    </table>

    <!-- adding hidden field to hold id on update -->
<form:hidden path="id" />   

</form:form>

検証を実行し、いくつかのエラーを返すかどうかのコントローラー メソッド

@RequestMapping(value = "/ajax", method = RequestMethod.POST)
protected @ResponseBody ValidationResponse createOrUpdate(
        @Validated @ModelAttribute("employeeModel") Employee employee,
        BindingResult bindingResult) {

    if (!bindingResult.hasErrors()) {
        employeeService.createOrUpdate(employee);
    }

    return validate(employee, null, bindingResult);
}

問題の場合:これはすべて正常に機能し、ドロップダウンが入力され、データが入力に入力されます。しかし、送信をクリックすると、次のエラーが表示されます。

java.lang.IllegalStateException: タイプ [java.lang.String] の値をプロパティ 'area' の必要なタイプ [com.whatever.Area] に変換できません: 一致するエディターまたは変換戦略が見つかりません

私が理解している限り、フォームはリストからオブジェクトをバインドするのではなく、「領域」のプレーン文字列を送信するだけです。

文字列ではなくオブジェクトを送信するフォームを取得するにはどうすればよいですか? 私のバインディングに何か問題がありますか?

ご協力いただきありがとうございます!

4

2 に答える 2

1

私自身の質問に答えるために、そしてその男が知らないうちに私を助けてくれた多くの信用を得ることを願っています;)

カスタムバインダーを追加する必要がありました...それは前に聞いたことがないので、最初に長い道のりを尋ねました。

このリンクには、私が探しているものを知っていたので見つけた、その主題に関する最良かつ最短のチュートリアルがあります: http://empire5.com/development/binding-a-custom-object-in-spring-3/

于 2012-08-01T20:53:24.650 に答える
0

selectの場合、このタイプのコードを試すことができると思います

<select name="area" id="area" >      
  <option value="${areas}">${areas}</option>
</select>
于 2012-08-01T19:03:57.747 に答える