【发布时间】:2015-10-11 20:50:22
【问题描述】:
我对 Play 还很陌生!我正在为一个简单的动态表单编写代码。我有两个模型类:Extension 和 ExtensionPair。一个 Extension 可以包含许多 ExtensionPair,因此我希望能够添加任意数量的 ExtensionPair,然后提交表单并在提交后将其绑定到 Extension Java 对象。
当我为 ExtensionPairs 使用 ArrayList 时,我的代码运行良好(参见下面的代码)。但是,如果我尝试改用 HashSet,我会得到:
[InvalidPropertyException: Invalid property 'objectExtensionPairs[0]' of bean class
[models.Extension]: Illegal attempt to get property 'objectExtensionPairs' threw
exception; nested exception is org.springframework.beans.InvalidPropertyException:
Invalid property 'objectExtensionPairs[0]' of bean class [models.Extension]: Cannot
get element with index 0 from Set of size 0, accessed using
property path 'objectExtensionPairs[0]']
我在 StackOverflow 中寻找一些问题,发现 this one 几乎说我无法将 HashSet 与 Spring 框架绑定。
是否有任何替代方法可以使用 HashSet 和 Play 表单绑定!和Java?
请看我下面的代码:
Extension.java:
package models;
import java.util.ArrayList;
public class Extension {
public Extension() {
objectExtensionPairs = new ArrayList<ExtensionPair>();
}
public Extension(String objectExtensionOrganization, String objectExtensionDescription) {
this();
this.objectExtensionOrganization = objectExtensionOrganization;
this.objectExtensionDescription = objectExtensionDescription;
}
// Getters and Setters
private ArrayList<ExtensionPair> objectExtensionPairs;
private String objectExtensionOrganization;
private String objectExtensionDescription;
}
ExtensionPair.java:
package models;
public class ExtensionPair {
public ExtensionPair() {
}
public ExtensionPair(String objectExtensionKey, String objectExtensionValue) {
this.objectExtensionKey = objectExtensionKey;
this.objectExtensionValue = objectExtensionValue;
}
// Getters and Setters
private String objectExtensionKey;
private String objectExtensionValue;
}
我已经编写了 Play!两者的 Java 模板,这样我就可以使用带有“添加”和“删除”按钮的动态表单创建或编辑扩展,以便拥有尽可能多的扩展对。
extensionPairTemplate.scala.html:
@(extP: ExtensionPair, index: Int = 0)
@extensionPair = @{ if(extP == null) new ExtensionPair("","") else extP }
<script type="text/javascript">
// Some JavaScript code to make the form dynamic (add/remove pairs)
</script>
<div id="epDiv@index.toString()">
objectExtensionKey:
<input type="text" name="objectExtensionPairs[@index.toString()].objectExtensionKey" value="@extensionPair.getObjectExtensionKey()"/>
objectExtensionValue:
<input type="text" name="objectExtensionPairs[@index.toString()].objectExtensionValue" value="@extensionPair.getObjectExtensionValue()" />
<button type="button" id="removeExtensionPairButton@index.toString()" onclick="removeExtensionPairFormElements(@index.toString())">Remove</button>
</div>
extensionTemplate.scala.html:
@(extensionForm: Form[models.Extension], ext: Extension)
@extension = @{ if(ext == null) new Extension("","") else ext }
<script src="@routes.Assets.versioned("javascripts/jquery-1.11.3.min.js")" type="text/javascript"></script>
<script type="text/javascript">
// Some JavaScript code to make the form dynamic (add/remove pairs)
</script>
@helper.form(action = routes.Application.addExtension) {
<div id="extensionDiv">
<fieldSet>
@helper.inputText(extensionForm("objectExtensionOrganization").copy(value=Some(extension.getObjectExtensionOrganization())))
@helper.inputText(extensionForm("objectExtensionDescription").copy(value=Some(extension.getObjectExtensionDescription())))
<div id="extensionPairsDiv">
@if(extension.getObjectExtensionPairs().size() > 0) {
@for((ep,epIndex) <- extension.getObjectExtensionPairs().zipWithIndex) {
@extensionPairTemplate(ep, epIndex)
}
}
</div>
</fieldSet>
<br/>
<button type="button" id="addPair">Add extension pair</button>
<input type="submit" value="Submit"/>
</div>
}
我的控制器:
// For when the form is submitted (i.e. editing an Extension)
public Result addExtension() {
Form<Extension> formExtension = Form.form(Extension.class).bindFromRequest();
Extension e = formExtension.get();
return ok(extensionTemplate.render(Form.form(Extension.class), e));
}
// For when a new Extension is being created
public Result extensionForm() {
return ok(extensionTemplate.render(Form.form(Extension.class), null));
}
【问题讨论】:
标签: java forms spring-mvc data-binding playframework