POJO,JPA绑定和复选框

POJO,JPA绑定和复选框

问题描述:

播放使用“未解决的参数被安全忽略,类型不匹配也被安全地忽略。将参数绑定到POJO时。它大部分时间都很好用。POJO,JPA绑定和复选框

但是这会导致复选框出现问题,因为未选中的复选框不会在参数列表中发送。

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

源,显示一个复选框:

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

另一种方法是通过不使复选框作为对象的成员,但作为单独的参数。然后可以赶上这在控制器和设置object.member那里,就像这样:

<input id="object_isInvoiceable" type="checkbox" name="isInvoiceableExtraParamFromHell" /> 

,并在控制器:

public static void save(Event object, Boolean isInvoiceableExtraParamFromHell) { 
    if(isInvoiceableExtraParamFromHell == null) { 
     object.isInvoiceable = false; 
    } 
    else { 
     object.isInvoiceable = true; 
    } 

    ... validation etc ... 

    object.save(); 

    ... render etc ... 
} 

我不喜欢另类1,因为我怎么能请确保在所有浏览器中正确发送参数的顺序。

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

有没有更好的方法来做到这一点?我对Play Framework相当陌生,所以我可能会错过一些注释或其他东西。

编辑:

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

从playframework tutorial

可以自动绑定使用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; 
    ... 
    ... 
} 

对于现有的对象,你可以做的是CRUD使用,通过把反对一个jQuery的onclick行动,使复选框的值总是设置隐藏的主题略有变化值,并且这是隐藏的值映射到POJO。

因此,例如

<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> 

注:我没有检查的JavaScript代码,但你的想法。

+0

谢谢你的回答。不幸的是,这不适用于已存储的JPA对象。我之前的帖子中有点不清楚,并且对它进行了编辑。 – Franz 2012-01-10 07:42:33

+0

谢谢。似乎是合理的解决方法。另一种方法是将选择框放在Yes/No或类似的位置。 – Franz 2012-01-10 08:52:32

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

视图代码:

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

控制器代码:

public static void save(Event object) { 
    if(params.get("object.isInvoiceable") == null) { 
     object.isInvoiceable = false; 
    } 

    ... validation etc ... 

    object.save(); 

    ... render etc ... 
} 

很适合我。