user2054833
user2054833

Reputation: 2165

RoboGuice provision errors

I am using RoboGuice Providers to injecting custom dependencies. I have two providers the first provides a Facebook AccessToken and second provides a Facebook instance which requires a access token therefore I inject it using the first provider.

 public class FacebookAccessTokenProvider implements Provider<AccessToken>{
    @Inject FBAccountDao dao;

    public AccessToken get() 
    {
       List<FacebookAccount> accounts = null;

       dao.open();
       accounts = dao.findAll();
       dao.close();
       if (accounts != null && !accounts.isEmpty())
       {
          FacebookAccount account = accounts.get(0);
          return new AccessToken(account.getToken(), account.getExpires());
       }
      return null;
    }
 }

public class FacebookProvider implements Provider<Facebook>{

@Inject private AccessToken accessToken;

public Facebook get() 
{   

    if (accessToken != null)
    {
        Facebook facebook = new FacebookFactory().getInstance();
        facebook.setOAuthAppId(AppCredentials.FACEBOOK_APP_ID,AppCredentials.FACEBOOK_APP_SECRET);
        facebook.setOAuthPermissions(AppCredentials.FACEBOOK_PERMISSION);
        facebook.setOAuthAccessToken(accessToken);

        return facebook;
    }
    return null;
}

}

Module:

    public void configure(Binder binder) 
{
    binder.bind(FBAccountDao.class).toProvider(FBAccountDaoProvider.class);
    binder.bind(TwitterAccountDao.class).toProvider(TwitterAccountDaoProvider.class);
    binder.bind(TwitterFriendDao.class).toProvider(TwitterFriendDaoProvider.class);
    binder.bind(FeedDao.class).toProvider(FeedDaoProvider.class);
    binder.bind(Facebook.class).toProvider(FacebookProvider.class);
    binder.bind(Token.class).toProvider(TwitterAccessTokenProvider.class);
    binder.bind(Twitter.class).toProvider(TwitterProvider.class);
    binder.bind(AccessToken.class).toProvider(FacebookAccessTokenProvider.class);
}

The problem is when I run the application it crashs and displays the following error:

java.lang.RuntimeException: Unable to start service com.soulfeed.service.FeedService@422368d8 with Intent { cmp=com.soulfeed/.service.FeedService (has extras) }: com.google.inject.ProvisionException: Guice provision errors:

1) null returned by binding at com.soulfeed.module.RoboGuiceModule.configure(RoboGuiceModule.java:34)
 but com.soulfeed.module.FacebookProvider.accessToken is not @Nullable
while locating com.soulfeed.module.FacebookAccessTokenProvider
while locating facebook4j.auth.AccessToken
for field at com.soulfeed.module.FacebookProvider.accessToken(Unknown Source)
while locating com.soulfeed.module.FacebookProvider
while locating facebook4j.Facebook

1 error
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2553)
at android.app.ActivityThread.access$2000(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4867)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
Caused by: com.google.inject.ProvisionException: Guice provision errors:

 1) null returned by binding at com.soulfeed.module.RoboGuiceModule.configure(RoboGuiceModule.java:34)
 but com.soulfeed.module.FacebookProvider.accessToken is not @Nullable
while locating com.soulfeed.module.FacebookAccessTokenProvider
while locating facebook4j.auth.AccessToken
for field at com.soulfeed.module.FacebookProvider.accessToken(Unknown Source)
while locating com.soulfeed.module.FacebookProvider
while locating facebook4j.Facebook

1 error
at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:987)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
at roboguice.inject.ContextScopedRoboInjector.getInstance(ContextScopedRoboInjector.java:143)
at com.soulfeed.request.AsyncRequestTask.<init>(AsyncRequestTask.java:64)
at com.soulfeed.request.FeedAsyncTask.<init>(FeedAsyncTask.java:33)
at com.soulfeed.service.FeedService.onStartCommand(FeedService.java:57)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2536)
... 10 more
com.google.inject.ProvisionException: Guice provision errors:

1) null returned by binding at com.soulfeed.module.RoboGuiceModule.configure(RoboGuiceModule.java:34)
 but com.soulfeed.module.FacebookProvider.accessToken is not @Nullable
 while locating com.soulfeed.module.FacebookAccessTokenProvider
 while locating facebook4j.auth.AccessToken
 for field at com.soulfeed.module.FacebookProvider.accessToken(Unknown Source)
 while locating com.soulfeed.module.FacebookProvider
 while locating facebook4j.Facebook

1 error
at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:987)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
at roboguice.inject.ContextScopedRoboInjector.getInstance(ContextScopedRoboInjector.java:143)
at com.soulfeed.request.AsyncRequestTask.<init>(AsyncRequestTask.java:64)
at com.soulfeed.request.FeedAsyncTask.<init>(FeedAsyncTask.java:33)
at com.soulfeed.service.FeedService.onStartCommand(FeedService.java:57)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2536)
at android.app.ActivityThread.access$2000(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4867)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)

Upvotes: 2

Views: 1282

Answers (1)

Tavian Barnes
Tavian Barnes

Reputation: 12922

In general it's bad practice to return null from Providers. The JavaDoc for get() even says "Must never return null." However, it does work anyway, but you need to annotate FacebookProvider.accessToken with @Nullable for Guice to allow null to be injected.

Upvotes: 3

Related Questions