定位Context时自定义提供程序,java Util.EmptyStackException出错

时间:2013-08-22 09:18:19

标签: android ormlite roboguice

我正在使用RoboGuice 2.0和ormlite开发一个Android项目v15。

我通过使用业务层和Dao层实现了数据访问。每个活动/服务调用业务层,还处理Daos之间的事务。

在我的第一次尝试中,一切正常,在我的Daos中,我有:

@Inject protected static DatabaseProvider databaseProvider;

因此,在roboguice模块配置中,我为需要提供者的相对dao类请求了StaticInjection。

我选择从databaseProvider中删除static关键字,并从模块配置中删除requestStaticInjection。

一切似乎都没问题,应用启动并可以访问数据库。当一个Activity上下文调用Dao时,一切正常,但是当从服务上下文调用Dao时,我得到了这个例外:

08-22 09:11:12.735: E/IncaricoServiceImpl(1779): Caused by: com.google.inject.ProvisionException: Guice provision errors:
08-22 09:11:12.735: E/IncaricoServiceImpl(1779): 1) Error in custom provider, java.util.EmptyStackException
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):   at roboguice.config.DefaultRoboModule.configure(DefaultRoboModule.java:130)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):   while locating android.content.Context
08-22 09:11:12.735: E/IncaricoServiceImpl(1779): 1 error
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:987)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at it.cpmapave.fgas.ioc.provider.DatabaseProvider.get(DatabaseProvider.java:18)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at it.cpmapave.fgas.dao.orm.GenericDaoOrm.getDao(GenericDaoOrm.java:32)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at it.cpmapave.fgas.dao.orm.GenericDaoOrm.queryForId(GenericDaoOrm.java:47)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at it.cpmapave.fgas.service.impl.IncaricoServiceImpl$1.call(IncaricoServiceImpl.java:103)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at it.cpmapave.fgas.service.impl.IncaricoServiceImpl$1.call(IncaricoServiceImpl.java:1)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at com.j256.ormlite.misc.TransactionManager.callInTransaction(TransactionManager.java:168)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    ... 8 more
08-22 09:11:12.735: E/IncaricoServiceImpl(1779): Caused by: java.util.EmptyStackException
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at java.util.Stack.peek(Stack.java:57)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at roboguice.inject.ContextScope$1.get(ContextScope.java:108)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974)
08-22 09:11:12.735: E/IncaricoServiceImpl(1779):    ... 14 more

这是我从ormlite databaseProvider获取Dao的方法:

protected Dao<T, Integer> getDao(){
    try {
        return databaseProvider.get().getDao(type);
    } catch (SQLException e) {
        if (LogConfig.ERROR_LOGS_ENABLED){
            Log.e(LOG_TAG, "Errore creazione Dao "+type.getSimpleName(), e);
        }
        return null;
    }
}

这里是我的DatabaseProvider:

public class DatabaseProvider implements Provider<OrmLiteSqliteOpenHelper> {

    @Inject
    private Provider<Context> contextProvider;

    @Override
    public OrmLiteSqliteOpenHelper get() {
        return OpenHelperManager.getHelper(contextProvider.get().getApplicationContext(), DatabaseOpenHelper.class);
    }
}

作为状态异常,似乎是一个上下文问题..

感谢您的任何建议!

0 个答案:

没有答案