Java 提交时将表单字段转换为对象
我对这个框架还比较陌生,所以我希望这是可以理解的 如何让play将表单元素映射到表单类中的对象字段 我有一个表单,其中包含从ORM中选择的对象名称下拉列表。下拉项的值是ORM对象的ID字段 Java端的表单对象有一个包含ORM对象类型的字段,还有一个setter获取字符串并将其转换为对象,但在表单提交时,我只得到一个表单错误“Invalid Value”,表明根本没有进行转换 我的模板有一个表单组件:Java 提交时将表单字段转换为对象,java,scala,playframework-2.0,Java,Scala,Playframework 2.0,我对这个框架还比较陌生,所以我希望这是可以理解的 如何让play将表单元素映射到表单类中的对象字段 我有一个表单,其中包含从ORM中选择的对象名称下拉列表。下拉项的值是ORM对象的ID字段 Java端的表单对象有一个包含ORM对象类型的字段,还有一个setter获取字符串并将其转换为对象,但在表单提交时,我只得到一个表单错误“Invalid Value”,表明根本没有进行转换 我的模板有一个表单组件: @helper.select( createAccountForm("industry
@helper.select(
createAccountForm("industry"),
helper.options(industries)
)
其中,industries
在模板构造函数中定义为: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));
}
}
编辑:我在课堂上做了setter,因为我想这样做,但那不起作用
编辑2:
事实证明,setter方法完全不是解决这个问题的方法。在试图让注释正常工作时,我的头猛撞了一下,然后注意到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;
}
});
}
公共类全局扩展全局设置{
//是的,这个街区是必要的;不,我不知道为什么。
{
register(Industry.class,new Formatters.SimpleFormatter()){
@凌驾
公共行业解析(字符串industryId,Locale)引发ParseException{
返回Industry.getIndustry(Integer.parseInt(industryId));
}
@凌驾
公共字符串打印(行业、区域设置){
返回行业名称;
}
});
}
}当您按照文档中的说明使用表单时,Play会为您将表单绑定到对象: 因此,您的控制器应该如下所示:
Form<models.Task> taskForm = form(models.Task.class).bindFromRequest();
if (taskForm.hasErrors()) {
return badRequest(views.html.tasks.create.render(taskForm));
}
Task task = taskForm.get();
请注意,我使用priorities.id
告诉play,所选的值应该由优先级id绑定。当然,还可以获取任务的优先级:
public static Map<String, String> priorities() {
LinkedHashMap<String, String> prioritiesList = new LinkedHashMap<String, String>();
List<Priority> priorities = Priority.getPrioritiesForTask("task");
for (Priority orderPrio : priorities) {
prioritiesList.put(orderPrio.getId().toString(), orderPrio.getDescription());
}
return prioritiesList;
}
公共静态映射优先级(){
LinkedHashMap prioritiesList=新建LinkedHashMap();
List priorities=Priority.getPrioritiesForTask(“任务”);
对于(优先级顺序优先级:优先级){
prioritiesList.put(orderPrio.getId().toString(),orderPrio.getDescription());
}
返回优先级列表;
}
如果play正确绑定了对象,这似乎是可行的,但事实并非如此。但我确实发现,我只需要为行业类添加一个格式化程序。
public static Map<String, String> priorities() {
LinkedHashMap<String, String> prioritiesList = new LinkedHashMap<String, String>();
List<Priority> priorities = Priority.getPrioritiesForTask("task");
for (Priority orderPrio : priorities) {
prioritiesList.put(orderPrio.getId().toString(), orderPrio.getDescription());
}
return prioritiesList;
}