Status: New
Owner: ----

New issue 627 by [email protected]: Bug in com.google.inject.internal.Initializer
http://code.google.com/p/google-guice/issues/detail?id=627

I sometimes get this exception when using assisted inject:

Caused by: java.lang.NullPointerException: null
at com.google.inject.internal.Initializer$InjectableReference.get(Initializer.java:147) ~[guice-3.0.jar:na] at com.google.inject.internal.ConstantFactory.get(ConstantFactory.java:35) ~[guice-3.0.jar:na] at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) ~[guice-3.0.jar:na] at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031) ~[guice-3.0.jar:na] at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[guice-3.0.jar:na]
        at com.google.inject.Scopes$1$1.get(Scopes.java:65) ~[guice-3.0.jar:na]
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) ~[guice-3.0.jar:na] at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978) ~[guice-3.0.jar:na] at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031) ~[guice-3.0.jar:na] at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974) ~[guice-3.0.jar:na] at com.google.inject.spi.ProviderLookup$1.get(ProviderLookup.java:89) ~[guice-3.0.jar:na] at com.google.inject.multibindings.MapBinder$RealMapBinder$2.get(MapBinder.java:387) ~[guice-multibindings-3.0.jar:na] at com.google.inject.multibindings.MapBinder$RealMapBinder$2.get(MapBinder.java:383) ~[guice-multibindings-3.0.jar:na] at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) ~[guice-3.0.jar:na] at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) ~[guice-3.0.jar:na] at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) ~[guice-3.0.jar:na] at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:83) ~[guice-3.0.jar:na] at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110) ~[guice-3.0.jar:na] at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:94) ~[guice-3.0.jar:na] at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) ~[guice-3.0.jar:na] at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:53) ~[guice-3.0.jar:na] at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978) ~[guice-3.0.jar:na] at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031) ~[guice-3.0.jar:na] at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974) ~[guice-3.0.jar:na] at com.proofpoint.experimental.json.JsonCodecFactory.createObjectMapper(JsonCodecFactory.java:121) ~[classes/:na]

After a bit of debugging I see that membersInjector is not initialized because InjectableReference.validate is not being called for some reason.

The obvious workaround it to add an if (membersInjector) validate(errors), but that seems like a hack.

In my code, if I put the assistedInject in a loop it works the second time through:

public class JsonCodecFactory
{
    private final Provider<ObjectMapper> objectMapperProvider;
    private final boolean prettyPrint;

    @Inject
    public JsonCodecFactory(Provider<ObjectMapper> objectMapperProvider)
    {
        this.objectMapperProvider = objectMapperProvider;
        this.prettyPrint = true;
    }

    public <T> JsonCodec<T> jsonCodec(Class<T> type)
    {
        Preconditions.checkNotNull(type, "type is null");

        return new JsonCodec<T>(createObjectMapper(), type);
    }

    private ObjectMapper createObjectMapper()
    {
        ObjectMapper objectMapper = null;
        while (objectMapper == null) {
            try {
                objectMapper = objectMapperProvider.get();
            }
            catch (Exception ignored) {
            }
        }
        if (prettyPrint) {
            objectMapper.getSerializationConfig().enable(INDENT_OUTPUT);
        }
        else {
            objectMapper.getSerializationConfig().disable(INDENT_OUTPUT);
        }
        return objectMapper;
    }
}


--
You received this message because you are subscribed to the Google Groups 
"google-guice-dev" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-guice-dev?hl=en.

Reply via email to