リクエスト スコープ スレッドから、CompletableFuture
s はエグゼキュータで実行されているタスクによって完了する必要があります。提供されたサプライヤーは、MessageService
セッション スコープのドメイン固有のサービスを使用します。そのサービスは Guice によって注入されます。
public class MessageProcessingPage {
private MessageService messageService;
@Inject
public MessagProcessingPage (MessageService messageService) {
this.messageService = messageService;
}
// Called by request scoped thread.
public void onProcessMessagesButton () {
ExecutorService executorService = Executors.newFixedThreadPool(3);
CompletableFuture.supplyAsync(
// Called from a thread from the threadpool.
() -> {return messageService.retrieveMessageMetadataSet(x, y);}
, executorService);
...
}
...
}
には、注入されるMessageService
(セッション スコープ)があります。MessageRestClient
@SessionScoped
public class MessageService {
private MessageRestClient messageRestClient;
@Inject
public MessageRestClient (MessageRestClient messageRestClient) {
this.messageRestClient = messageRestClient;
}
public MessageMetaDataSet retrieveMessageMetadataSet(x, y) {
List<MessageMetaData> listOfMetaData = messageRestClient.retrieve(x, y, z);
...
}
...
}
@SessionScoped
public class MessageRestClient {
...
}
を注入しようとすると、Guice がトラブルに巻き込まれMessageRestClient
ます。
java.util.concurrent.CompletionException: com.google.inject.ProvisionException: Unable to provision, see the following errors:
1) Error in custom provider, com.google.inject.OutOfScopeException: Cannot access scoped [MessageRestClient]. Either we are not currently inside an HTTP Servlet request, or you may have forgotten to apply com.google.inject.servlet.GuiceFilter as a servlet filter for this request.
のメソッドについて読みましたServletScopes
:public static <T> Callable<T> transferRequest(Callable<T> callable)
しかし、Callables が機能しないため、これを使用する方法がわかりません。解決策を教えてください。