1

私のアプリケーションは基本的に辞書です。「送信」をクリックすると、新しいWordオブジェクトがいくつかのフィールドとともにDBに保存されます。フィールドの1つはCategoryと呼ばれ、Wordがどのグループに属しているかを示します。現在、この値はWordオブジェクトのStringフィールドです。

これがjsp.fileの簡略化されたコードです

    <form:form method="post" action="addNewWord.html" commandName="word" >

    <table>


    //many other fields;    


        <tr>
            <td>Category:</td>
            <td><form:select path="category" items="${CATEGORIES}"
                    var="cat">
                </form:select></td>
            <td><form:errors path="category" cssClass="error" /></td>
        </tr>


        <tr>
            <td colspan="2"><input type="submit" value="Add new word" /></td>
        </tr>
    </table>

</form:form>

これがWordオブジェクトです。

@Entity
@Table(name = "word")
public class Word {

    //other instance variables either primitives or Strings;

    @Column(name = "category", nullable = false, length = 80)
    private String  category;
        //getters-setters 

この場合、すべてが正常で非常にうまく機能し、Wordオブジェクトがデータベースに保存されます。しかし、スタンドアロンのCategoryオブジェクトを作成することにし、WordオブジェクトのcategoryフィールドがStringではなく、Categoryのインスタンスである場合はどうなりますか?

    @ManyToOne
@JoinColumn(name = "category_id")
private Category category;

.jspファイルのフォームを変更して、文字列ではなくカテゴリのフィールドを持つ単語オブジェクトを送信するにはどうすればよいですか?全体像として、送信によって呼び出されるコントローラーのメソッドを示します。

@RequestMapping(value = "/addNewWord", method = RequestMethod.POST)
public String addNewWord(@ModelAttribute Word word, BindingResult result, Model model) {
    WordValidator validator = new WordValidator();
    validator.validateWord(word, result, wordService.getAllWord(), categoryService.getAllCategories());
    if (!result.hasErrors()) {
        wordService.save(word);
        word.clearValues();
    }
    fillCategoryNames(model);
    return "addNew";
}

@InitBinderメソッドを使うべきだと感じていますが、その方法がわかりません。それは確かな事実というよりは感覚のようなものです。どんなアドバイスでも大歓迎です。

4

1 に答える 1

2

どうぞ :

public class CategoryEditor extends PropertyEditorSupport {

    // Converts a String to a Category (when submitting form)
    @Override
    public void setAsText(String text) {
        Category c = new Category();
        c.setName(text);
        this.setValue(c);
    }

    // Converts a Category to a String (when displaying form)
    @Override
    public String getAsText() {
        Category c = (Category) this.getValue();
        return c.getName();
    }

}

...
public class MyController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Category.class, new CategoryEditor());
    }

    ...

}

詳細情報:

于 2012-09-15T17:28:47.810 に答える