Playframework POJO、JPA绑定和复选框

Playframework POJO、JPA绑定和复选框,playframework,Playframework,将参数绑定到POJO时,Play使用“安全忽略未解析的参数。也安全忽略类型不匹配”。它大部分时间都很有效 但这会给复选框带来麻烦,因为未选中的复选框不会在参数列表中发送 CRUD模块通过在复选框后面插入一个隐藏的输入字段解决了这个问题。这是因为Play只读取要绑定到的两个相同参数中的第一个 来源于CRUD模块,显示复选框: <input id="object_isInvoiceable" type="checkbox" name="obje

将参数绑定到POJO时,Play使用“安全忽略未解析的参数。也安全忽略类型不匹配”。它大部分时间都很有效

但这会给复选框带来麻烦,因为未选中的复选框不会在参数列表中发送

CRUD模块通过在复选框后面插入一个隐藏的输入字段解决了这个问题。这是因为Play只读取要绑定到的两个相同参数中的第一个

来源于CRUD模块,显示复选框:

<input id="object_isInvoiceable" type="checkbox" name="object.isInvoiceable" />
<input type="hidden" name="object.isInvoiceable" value="false" />
我不喜欢备选方案1,因为我如何确保在所有浏览器中正确发送参数的顺序

我不喜欢备选方案2,因为如果我更改对象,我必须管理单独的参数并修改控制器方法

有更好的方法吗?我对框架还很陌生,所以我可能错过了一些注释或其他东西

编辑:

我之前有点不清楚。问题不在于创建新对象时,然后我可以像Codemwnci建议的那样将其设置为默认值FALSE。问题在于绑定到已经存在的JPA对象时

从playframework:

您可以使用HTTP到Java绑定自动绑定JPA对象

您可以在HTTP参数中自己提供user.id字段。当Play找到id字段时,它会在编辑之前从数据库加载匹配实例。然后应用HTTP请求提供的其他参数。所以你可以直接保存它

在这种情况下,它不会将成员值设置为任何默认值


例如,我已经在数据库中存储了一个JPA对象,它的isInvoiceable设置为TRUE。我将此对象渲染到模板。如果我现在取消选中复选框,参数将不会被发送,因此isInvoiceable仍然为true。

对于新对象,您可以执行以下操作

如果要绑定POJO,那么只需在POJO中默认值就足够了

比如说

public class Event extends Model {

    public Boolean isInvoiceable = Boolean.FALSE;
    ...
    ...
}
<input id="object_isInvoiceable_checkbox" type="checkbox" name="ignoredformfield" />
<input id="object_isInvoiceable_formfield" type="hidden" name="object.isInvoiceable" value="false" />

<script>$("#object_isInvoiceable_checkbox").click(function(
    $("object_isInvoiceable_formfield").value("$("#object_isInvoiceable_checkbox").is(":checked")");
));</script>
对于现有对象,您可以对CRUD使用的主题稍作修改,方法是对其执行JQuery onclick操作,以便复选框的值始终设置隐藏值,而映射到POJO的正是该隐藏值

比如说

public class Event extends Model {

    public Boolean isInvoiceable = Boolean.FALSE;
    ...
    ...
}
<input id="object_isInvoiceable_checkbox" type="checkbox" name="ignoredformfield" />
<input id="object_isInvoiceable_formfield" type="hidden" name="object.isInvoiceable" value="false" />

<script>$("#object_isInvoiceable_checkbox").click(function(
    $("object_isInvoiceable_formfield").value("$("#object_isInvoiceable_checkbox").is(":checked")");
));</script>

$(“#对象#可查看#复选框”)。单击(函数(
$(“object_isInvoiceable_formfield”)。值($(“#object_isInvoiceable_复选框”)。为(“:checked”);
));

注意:我没有检查javascript代码,但您已经了解了。

我有另一个解决方案,它避免了在模板中需要隐藏/额外字段

查看代码:

<input id="object_isInvoiceable" type="checkbox" name="object.isInvoiceable" />

很适合我。

谢谢你的回答。不幸的是,这不适用于已经存储的JPA对象。我之前的帖子有点不清楚,我已经编辑过了。谢谢。似乎是合理的解决办法。另一种方法是在选择框中输入Yes/No或类似内容。
public static void save(Event object) {
    if(params.get("object.isInvoiceable") == null) {
        object.isInvoiceable = false;
    }

    ... validation etc ...

    object.save();

    ... render etc ...
}