我在使用@OneToMany綁定和Java Play中的bindFromRequest方法時遇到問題。目前,我有,有許多FinancialAsset車型Java與JSON玩複雜數據綁定
@Entity
public class Client extends Model {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "client")
public List<FinancialAsset> assetList;
...
}
這裏是我的FinancialAsset模型的要點客戶端模型
@Entity
public class FinancialAsset extends Model {
@Id
public long id;
@ManyToOne(optional = false)
@JoinColumn(name="client", referencedColumnName = "id")
public Client client;
public enum AssetType {
K401, ANNUITY, CASH, CD, GOLD, IRA, PARTNERSHIP, RENTAL_PROP, RETIREMENT_ACCT
}
public float totalValue;
public AssetType realAssetType;
public String financialInstitute;
public String description;
public void setRealAssetType (String assetTypeString) {
this.realAssetType = AssetType.valueOf(assetTypeString);
}
public static List<AssetType> getAllAssetTypes() {
List<AssetType> all = new ArrayList<AssetType>(Arrays.asList(AssetType.values()));
return all;
}
public static Finder<Long,FinancialAsset> find = new Finder(Long.class, FinancialAsset.class);
public static List<FinancialAsset> allForClient(Client client) {
return find.where().eq("clientId", client.id).findList();
}
}
當我的前端客戶端(Angular.js)調用我的方法來更新客戶端具有下列數據:
{
id: 1234,
assetList: Array[1]
assetType: "ANNUITY",
totalValue: 50000,
description: "blah",
financialInstitue: "blahstitute",
otherClientproperties: "..."
}
它試圖bindFromRequest但錯誤,當我做一個get()獲取客戶端:
@BodyParser.Of(play.mvc.BodyParser.Json.class)
public static Result editClientJSON() {
Logger.debug("Reached editClientJSON");
Form<Client> clientForm = Form.form(Client.class);
//Error is here on the get
Client client = clientForm.bindFromRequest().get();
client.update();
Logger.debug("Client updated: " + client.name);
response().setHeader(LOCATION, routes.ClientCtrl.getClientJSON(client.id).url());
return ok();
}
錯誤輸出:
play.api.Application$$anon$1: Execution exception[[IllegalStateException: No value]]
at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.1]
at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:144) [play_2.10.jar:2.1.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:140) [play_2.10.jar:2.1.1]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1]
java.lang.IllegalStateException: No value
at play.libs.F$None.get(F.java:540) ~[play_2.10.jar:2.1.1]
at play.data.Form.get(Form.java:525) ~[play-java_2.10.jar:2.1.1]
at controllers.ClientCtrl.editClientJSON(ClientCtrl.java:60) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$14$$anonfun$apply$14.apply(routes_routing.scala:225) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$14$$anonfun$apply$14.apply(routes_routing.scala:225) ~[na:na]
at play.core.Router$HandlerInvoker$$anon$6$$anon$2.invocation(Router.scala:164) ~[play_2.10.jar:2.1.1]
我的想法是,它有麻煩綁定資產列表,以FinancialAsset模型。我不知道如何調試或找出它的需求。
在此先感謝!
謝謝你的幫助。不幸的是,該表單似乎沒有任何錯誤。調試允許我一直到clientForm.get(),它繼續拋出相同的錯誤。在調試時我注意到它似乎認爲表單沒有數據。該請求似乎有一個json部分下的數據,但在urlFormEncoded或xml下它說「無」。 「無」也是表單在bindFromRequest之後認爲它具有的內容。我想知道如果這可能是一個註釋問題或JSON問題。 – gmills82 2014-09-23 00:30:50
挖掘更深入的調試,它似乎既不綁定也不bindFromRequest被調用。如果我評估請求()。body()。asJson()我得到正確的數據在PUT中發送。但由於某些原因,它不會將這些數據放入clientForm中。 – gmills82 2014-09-23 01:14:52