У меня есть следующая проблема с Guice: однопользовательская услуга, которой выдается поставщик контекстно-зависимой информации. До сих пор, контекст не был связан только с запросами сервлета, поэтому я использовал @RequestScoped провайдера, и я впрыскивание этого поставщика в обслуживании, так как:Использование провайдера из двух разных областей применения
@RequestScoped
public class ContextProvider<IContext> implements Provider<IContext> {
@Override
public IContext get() { ... } // returns context
}
@Singleton
public class ServiceImpl implements IService {
@Inject
private Provider<IContext> contextProvider;
}
Это работает отлично. Теперь я работаю над добавлением обработки фоновой задачи в приложение. Фоновые задачи не инициируются из веб-запросов, поэтому я не могу использовать ServletScopes.scopeRequest (..). Я написал собственную область (почти точную копию BatchScoped из документа Giuce), чтобы каждая задача выполнялась в ее собственной области. Теперь возникает вопрос: как сделать BatchScoped ContextProvider и настроить Guice для его использования?
Я сделал эту попытку с связывающим EDSL:
line 1 : bind(IContext.class).toProvider(ContextProvider.class).in(RequestScoped.class);
line 2 : bind(IContext.class).toProvider(BatchContextProvider.class).in(BatchScoped.class);
но Guice говорит мне в строке 2, «Привязка к IContext был уже настроен на линии 1».
Вопрос в том, как правильно делать такую инъекцию с помощью Guice?
Я не понимаю, почему вы не можете использовать 'ServletScopes.scopeRequest()', это именно то, для чего он был предназначен. –
Я не могу использовать его, потому что фоновая задача не инициируется из веб-запроса. Таким образом, RequestScope не доступен. – execc
Вы попробовали? Я думаю, вы обнаружите, что это 'scopeRequest()' делает: он создает «поддельную» область запроса. –