【发布时间】:2014-09-09 07:38:20
【问题描述】:
这是一个 Play Framework(2.0.4,Java)控制器操作,旨在返回一个 Json 数组,其中包含实现相同接口的类的各种实例。我想将 Json 字段限制为 4 个(警报器、nic、ncc、nccenr,我的对象是法国机构)。 我实例化了一个机构 ArrayList,其中填充了通过 EBean 查询过滤的不同机构的实例。
public static Result getCollectivitesList() {
List<Institution> collectivites = new ArrayList<Institution>();
collectivites.addAll(Commune.find.where().eq("departement", Departement.findByCode("44")).findList());
collectivites.addAll(EtablissementPublic.find.all());
collectivites.addAll(Departement.find.where().eq("code", 44).findList());
collectivites.addAll(Region.find.where().eq("code", 52).findList());
JsonContext jsonContext = Ebean.createJsonContext();
JsonWriteOptions options = new JsonWriteOptions();
options.setRootPathProperties("siren, nic, ncc, nccenr");
String jsonString = jsonContext.toJsonString(collectivites, true, options);
return ok(Json.parse(jsonString));
}
个人只能得到一种机构,但是当我尝试混合2、3或4种时,它会抛出异常:
java.lang.RuntimeException: There is no HTTP Context available from here.
play.mvc.Http$Context.current(Http.java:27)
play.mvc.Controller.session(Controller.java:49)
play.mvc.Controller.session(Controller.java:63)
controllers.Authentication.isAuthenticated(Authentication.java:49)
views.html.main$.apply(main.template.scala:92)
views.html.errors.internalServerError$.apply(internalServerError.template.scala:30)
views.html.errors.internalServerError$.render(internalServerError.template.scala:53)
views.html.errors.internalServerError.render(internalServerError.template.scala)
Global.onError(Global.java:21)
play.core.j.JavaGlobalSettingsAdapter.onError(JavaGlobalSettingsAdapter.scala:30)
play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:159)
play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115)
akka.actor.Actor$class.apply(Actor.scala:318)
play.core.ActionInvoker.apply(Invoker.scala:113)
akka.actor.ActorCell.invoke(ActorCell.scala:626)
akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197)
akka.dispatch.Mailbox.run(Mailbox.scala:179)
akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:516)
akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259)
akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
调用JsonContext.toJsonString() 时会抛出此异常。我不明白这个问题,多态性问题之间的关系,异常和启动它的方法。
你有更好的想法吗?
编辑:
我尝试了另一种选择。我写了一个嵌套类:
private static class SimplifiedInstitution {
String siren;
String nic;
String ncc;
String nccenr;
public SimplifiedInstitution(String siren, String nic, String ncc, String nccenr) {
this.siren = siren;
this.nic = nic;
this.ncc = ncc;
this.nccenr = nccenr;
}
}
我在 foreach 循环中填充了 SimplifiedInstitution 的 ArrayList,而不是 jsonContext:
for (Institution institution : collectivites) {
simplified.add(new SimplifiedInstitution(institution.siren(), institution.nic(), institution.ncc(), institution.nccenr()));
}
然后像这样返回 Json:
return ok(Json.toJson(simplified));
最后一行抛出完全相同的异常...
【问题讨论】:
标签: java json playframework playframework-2.0 ebean