【问题标题】:Exception when trying to return filtered Json objects array of different classes implementing the same interface尝试返回实现相同接口的不同类的过滤 Json 对象数组时出现异常
【发布时间】: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


    【解决方案1】:

    我用 DIY 技巧解决了这个问题:使用上面的替代尝试,覆盖 SimplifiedInstitutiontoString() 方法:

    public String toString() {
            return "{\"siren\":\"" + siren + "\",\"nic\":\"" + nic + "\",\"ncc\":\"" + ncc + "\",\"nccenr\":\"" + nccenr + "\"}";
        }
    

    并像这样重写控制器动作的返回语句:

    return ok(simplified.toString()).as("application/json");
    

    这不是很令人满意,也没有解释问题的原因,但它确实有效。

    PS:对不起我的英语...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多