0 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)
برچسب گذاری دوباره قبل توسط

وقتی در یک متد Action در Play Framework که CompletionStage بر می گرداند می خواهم به request جاری دسترسی داشته باشم با خطای زیر روبرو می شوم:

[CompletionException: java.lang.RuntimeException: There is no HTTP Context available from here.]

در کد زیر:

    public CompletionStage<Result> message() {
        return getFutureMessage(1, TimeUnit.SECONDS)
                .thenApply(result -> ok(request().host() + " - " + result));
    }

    private CompletionStage<String> getFutureMessage(long time, TimeUnit timeUnit) {
        CompletableFuture<String> future = new CompletableFuture<>();
        actorSystem.scheduler().scheduleOnce(
                Duration.create(time, timeUnit),
                () -> future.complete("Hi!"),
                exec
        );
        return future;
    }

فراخوانی request().host را که حذف می کنم کد مشکلی ندارد.

1 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)
 
بهترین پاسخ

چون داریم از CompletionStage استفاده می کنیم، ممکن است در زمان تغییر thread اطلاعات context از دست برود و در دسترس نباشد بنابراین باید از HttpExecutionContext در زمان باز کردن CompletionStage تکمیل شده استفاده کنیم و آن را به متد thenApplyAsync ارسال کنیم:

    @Inject HttpExecutionContext ec

    public CompletionStage<Result> message() {
        return getFutureMessage(1, TimeUnit.SECONDS)
                .thenApplyAsync(result -> ok(request().host() + " - " + result)
                        , ec.current());
    }

    private CompletionStage<String> getFutureMessage(long time, TimeUnit timeUnit) {
        CompletableFuture<String> future = new CompletableFuture<>();
        actorSystem.scheduler().scheduleOnce(
                Duration.create(time, timeUnit),
                () -> future.complete("Hi!"),
                exec
        );
        return future;
    }

سوالات مشابه

0 امتیاز
1 پاسخ 254 بازدید
+1 امتیاز
1 پاسخ 336 بازدید
+1 امتیاز
1 پاسخ 341 بازدید
+1 امتیاز
1 پاسخ 498 بازدید
0 امتیاز
1 پاسخ 362 بازدید
0 امتیاز
1 پاسخ 309 بازدید
0 امتیاز
1 پاسخ 547 بازدید
سوال شده 9 سال قبل در برنامه نویسی توسط ftmh (7 امتیاز)
+1 امتیاز
1 پاسخ 375 بازدید
...