私は Play Framework にかなり慣れていないので、これがわかりやすいことを願っています。
フォーム要素をフォームのクラスのオブジェクト フィールドにマップするように play に指示するにはどうすればよいですか?
ORM からオブジェクトの名前をドロップダウンで選択するフォームがあります。ドロップダウン項目の値は、ORM オブジェクトの ID フィールドです。
Java側のフォームオブジェクトには、ORMオブジェクトのタイプのフィールドと、文字列を取得してオブジェクトに変換するセッターがありますが、フォーム送信時に、変換が無効であることを示すフォームエラー「無効な値」のみが表示されますまったく行われています。
私のテンプレートにはフォームコンポーネントがあります:
@helper.select(
createAccountForm("industry"),
helper.options(industries)
)
whereindustries
はテンプレート コンストラクターで : によって定義され、industries: Map[String, String]
ID 文字列からユーザーが読み取り可能な名前で構成されます。
私のコントローラーはクラスを定義します:
public static class CreateAccountForm {
public String name;
public Industry industry;
public void setIndustry(String industryId) {
this.industry = Industry.getIndustry(Integer.parseInt(industryId));
}
}
編集:この答えがそうするように指示されたので、私はクラスでセッターをしていましたが、それはうまくいきませんでした。
EDIT2:セッターメソッドは、これを行う方法ではなかったことがわかりました。アノテーションを機能させようとして頭を悩ませた後、Formatters.SimpleFormatter に気付き、それを試してみました。うまくいきましたが、その周りに余分なブロックが必要な理由はわかりません。
Global.java:
public class Global extends GlobalSettings {
// Yes, this block is necessary; no, I don't know why.
{
Formatters.register(Industry.class, new Formatters.SimpleFormatter<Industry>() {
@Override
public Industry parse(String industryId, Locale locale) throws ParseException {
return Industry.getIndustry(Integer.parseInt(industryId));
}
@Override
public String print(Industry industry, Locale locale) {
return industry.name;
}
});
}
}