Java 提交时将表单字段转换为对象

Java 提交时将表单字段转换为对象,java,scala,playframework-2.0,Java,Scala,Playframework 2.0,我对这个框架还比较陌生,所以我希望这是可以理解的 如何让play将表单元素映射到表单类中的对象字段 我有一个表单,其中包含从ORM中选择的对象名称下拉列表。下拉项的值是ORM对象的ID字段 Java端的表单对象有一个包含ORM对象类型的字段,还有一个setter获取字符串并将其转换为对象,但在表单提交时,我只得到一个表单错误“Invalid Value”,表明根本没有进行转换 我的模板有一个表单组件: @helper.select( createAccountForm("industry

我对这个框架还比较陌生,所以我希望这是可以理解的

如何让play将表单元素映射到表单类中的对象字段

我有一个表单,其中包含从ORM中选择的对象名称下拉列表。下拉项的值是ORM对象的ID字段

Java端的表单对象有一个包含ORM对象类型的字段,还有一个setter获取字符串并将其转换为对象,但在表单提交时,我只得到一个表单错误“Invalid Value”,表明根本没有进行转换

我的模板有一个表单组件:

@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;
}