xiaodududu / google-guice

Automatically exported from code.google.com/p/google-guice
Apache License 2.0
0 stars 0 forks source link

Provide a better error message when you try to inject a raw Provider. #633

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
Current error:

Exception in thread "main" 
com.google.inject.internal.util.$ComputationException: 
java.lang.ClassCastException: java.lang.Class cannot be cast to 
java.lang.reflect.ParameterizedType
    at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553)
    at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419)
    at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041)
    at com.google.inject.internal.FailableCache.get(FailableCache.java:50)
    at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:49)
    at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:125)
    at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:521)
    at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847)
    at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
    at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
    at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
    at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
    at com.google.inject.internal.InjectorImpl.getProviderOrThrow(InjectorImpl.java:967)
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1000)
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
    at bake.tool.Repository$Builder.build(Repository.java:185)
    at bake.tool.Main.main(Main.java:35)
    at bake.tool.Test.main(Test.java:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to 
java.lang.reflect.ParameterizedType
    at com.google.inject.internal.MoreTypes.canonicalizeForKey(MoreTypes.java:82)
    at com.google.inject.Key.<init>(Key.java:126)
    at com.google.inject.Key.get(Key.java:256)
    at com.google.inject.internal.Annotations.getKey(Annotations.java:149)
    at com.google.inject.spi.InjectionPoint.forMember(InjectionPoint.java:115)
    at com.google.inject.spi.InjectionPoint.<init>(InjectionPoint.java:78)
    at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:272)
    at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:96)
    at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:629)
    at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
    at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
    at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
    at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
    at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
    at com.google.inject.internal.InjectorImpl.createParameterInjector(InjectorImpl.java:925)
    at com.google.inject.internal.InjectorImpl.getParametersInjectors(InjectorImpl.java:913)
    at com.google.inject.internal.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:69)
    at com.google.inject.internal.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:28)
    at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:36)
    at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:32)
    at com.google.inject.internal.FailableCache$1.apply(FailableCache.java:39)
    at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549)
    ... 23 more

Process finished with exit code 1

Original issue reported on code.google.com by crazybob...@gmail.com on 27 May 2011 at 5:29

GoogleCodeExporter commented 9 years ago
Can you add a testcase that reproduces this?  With this code:

  public void testRawProviderInjection() {
    Guice.createInjector().getInstance(HasRawProvider.class);
  }

  private static class HasRawProvider {
    @Inject HasRawProvider(Provider p) {}
  }

I get:

com.google.inject.ConfigurationException: Guice configuration errors:

1) Cannot inject a Provider that has no type parameter
  while locating com.google.inject.Provider
    for parameter 0 at com.google.inject.InjectorTest$HasRawProvider.<init>(InjectorTest.java:419)
  while locating com.google.inject.InjectorTest$HasRawProvider

1 error
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1016)
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:975)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1025)
    at com.google.inject.InjectorTest.testRawProviderInjection(InjectorTest.java:415)

Original comment by sberlin on 16 Oct 2011 at 4:20