Прямая ссылка на себя приводит к ошибке цикла, когда я конвертирую CompletionStage <PagedList <Home>> в json, используя следующий код? - PullRequest
0 голосов
/ 18 мая 2019

Используя java-paly-ebean-exmaple 2.7, я преобразовываю ответ html-представления в ответ json rest для действия со списком, и получаю следующую ошибку:

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.RuntimeException: java.lang.IllegalArgumentException: Direct self-reference leading to cycle (through reference chain: io.ebeaninternal.server.query.LimitOffsetPagedList["futureCount"]->io.ebeaninternal.server.query.QueryFutureRowCount["query"]->io.ebeaninternal.server.querydefn.DefaultOrmQuery["beanDescriptor"]->io.ebeaninternal.server.deploy.BeanDescriptor["idProperty"]->io.ebeaninternal.server.deploy.BeanProperty["property"])]]
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:323)
    at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:243)
    at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:382)
    at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:380)
    at scala.concurrent.Future.$anonfun$recoverWith$1(Future.scala:417)
    at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:41)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
    at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
    at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91)
    at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)

Это действие списка для моего класса контроллера:

 public CompletionStage<Result> list(Http.Request request, int page,  int pageSize, String sortBy, String order, String filter) {
        log.info("---------> Home List method ----> ");
        //return CompletableFuture.completedFuture(ok("value is Not some Data ..."));
        // Run a db operation in another thread (using DatabaseExecutionContext)
        return homeRepository.page(page, pageSize, sortBy, order, filter).thenApplyAsync(list -> {
            // This is the HTTP rendering thread contex
            return ok(Json.toJson(list));
        }, ec.current());

    }

Это метод страницы для моего класса репозитория:

 public CompletionStage<PagedList<Home>> page(int page, int pageSize, String sortBy, String order, String filter) {
        log.info("---------> page method -->" + page +  "<--->" + pageSize +  "<--->" + sortBy +  "<--->" + order +  "<--->" + filter );
        CompletionStage<PagedList<Home>> homes = supplyAsync(() ->
                ebeanServer.find(Home.class).where()
                        .ilike("message", "%" + filter + "%")
                        .orderBy(sortBy + " " + order)
                        .setFirstRow(page * pageSize)
                        .setMaxRows(pageSize)
                        .findPagedList(), executionContext);
        return homes;
    }

когда я заменяю ok (Json.toJson (список)) на ok («все хорошо») в моем контроллере, я получаю ответ без ошибок.

это был оригинальный код списка контроллеров, который я преобразовал в ответ json:

public CompletionStage<Result> list(Http.Request request, int page, String sortBy, String order, String filter) {
        // Run a db operation in another thread (using DatabaseExecutionContext)
        return computerRepository.page(page, 10, sortBy, order, filter).thenApplyAsync(list -> {
            // This is the HTTP rendering thread context
            return ok(views.html.list.render(list, sortBy, order, filter, request, messagesApi.preferred(request)));
        }, httpExecutionContext.current());
    }

не могу понять, в чем проблема?

Спасибо

...