Java 当从下拉框中选择相应的对象id时,如何在模型中设置对象引用

Java 当从下拉框中选择相应的对象id时,如何在模型中设置对象引用,java,playframework,playframework-2.0,Java,Playframework,Playframework 2.0,我是新玩框架,我试图保存的用户信息是由管理员在视图中输入的。我正在使用form helper渲染视图。视图中的一个字段是下拉框,它允许用户选择等级级别,该级别具有等级id值,显示文本具有等级名称。在我的用户模型中,我有一个字段作为gradeLevel,它引用了gradeLevel模型。当从下拉框中选择相应的等级id时,我不知道如何设置等级级别对象。现在它抛出非法状态异常:提交表单时没有值 下面给出了代码片段 看法 等级模型 @Entity @Table(name="grade_level") p

我是新玩框架,我试图保存的用户信息是由管理员在视图中输入的。我正在使用form helper渲染视图。视图中的一个字段是下拉框,它允许用户选择等级级别,该级别具有等级id值,显示文本具有等级名称。在我的用户模型中,我有一个字段作为gradeLevel,它引用了gradeLevel模型。当从下拉框中选择相应的等级id时,我不知道如何设置等级级别对象。现在它抛出非法状态异常:提交表单时没有值

下面给出了代码片段

看法

等级模型

@Entity
@Table(name="grade_level")
public class GradeLevel extends Model
{
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    public int id;

    @Column(length = 40, nullable = false)
    @Constraints.MinLength(2)
    @Constraints.MaxLength(40)
    public String name;
}
控制器

public static Result validate()
{
    Form<UserDetails> submittedForm = userForm.bindFromRequest();

    if(userForm.hasErrors())
    {
        return redirect(routes.SessionController.home());
    }
    else
    {
        UserDetails userDetails = null;
        try
        {
            userDetails = submittedForm.get();      
        }
        catch (IllegalStateException illegalException)
        {
            Logger.error("IllegalStateException",illegalException);
            return redirect(routes.SessionController.home());
        }
        userDetails.save();

        return redirect(routes.UserController.show());
    }
}
公共静态结果验证()
{
Form submittedForm=userForm.bindFromRequest();
if(userForm.hasErrors())
{
返回重定向(routes.SessionController.home());
}
其他的
{
UserDetails UserDetails=null;
尝试
{
userDetails=submittedForm.get();
}
捕获(非法状态异常非法状态异常)
{
Logger.error(“IllegalStateException”,illegalException);
返回重定向(routes.SessionController.home());
}
userDetails.save();
返回重定向(routes.UserController.show());
}
}

您的代码中有一些缺陷,但第一个大问题是:

Form<UserDetails> submittedForm = userForm.bindFromRequest();

if(userForm.hasErrors())
现在的解决方案是告诉Play如何将此“2”转换为
GradeLevel

我知道有两种选择:

1) 您可以手动计算绑定表单-只需使用提供的值创建对象。您可以从数据库中提取id为“2”的
GradeLevel
,然后创建一个新的/更新现有的UserDetails对象,使用“foo”作为firstName,“bar”作为lastName,设置UserDetails.GradeLevel并保存

2) 看看 尤其是底部带有自定义数据绑定器的部分-您可以为GradeLevel注册一个数据绑定器-请记住在绑定表单之前执行此操作。现在,Play将知道如何处理从“2”到
GradeLevel
对象的转换,您可以继续


编辑:请更改视图的参数列表,以便接受映射而不是哈希映射(如
Map[String,String]
)。这样,您就不会只局限于
HashMap
s。针对接口编程。

感谢您的输入。现在我使用了您的第二个选项
自定义数据绑定器
,它可以正常工作。
public static Result validate()
{
    Form<UserDetails> submittedForm = userForm.bindFromRequest();

    if(userForm.hasErrors())
    {
        return redirect(routes.SessionController.home());
    }
    else
    {
        UserDetails userDetails = null;
        try
        {
            userDetails = submittedForm.get();      
        }
        catch (IllegalStateException illegalException)
        {
            Logger.error("IllegalStateException",illegalException);
            return redirect(routes.SessionController.home());
        }
        userDetails.save();

        return redirect(routes.UserController.show());
    }
}
Form<UserDetails> submittedForm = userForm.bindFromRequest();

if(userForm.hasErrors())
Form(of=class models.UserDetails, data={lastName=bar, gradeLevel=2, firstName=foo},