diff --git a/.gitignore b/.gitignore index c92c585..39879fe 100644 --- a/.gitignore +++ b/.gitignore @@ -11,8 +11,10 @@ target/ .DS_Store .settings/ .springBeans +.sts4-cache/ +.vscode/ *.iml *.iws *.ipr .idea/ -credentials.yml \ No newline at end of file +credentials.yml diff --git a/src/main/java/org/springframework/guice/module/SpringModule.java b/src/main/java/org/springframework/guice/module/SpringModule.java index a541981..7ff3814 100644 --- a/src/main/java/org/springframework/guice/module/SpringModule.java +++ b/src/main/java/org/springframework/guice/module/SpringModule.java @@ -13,6 +13,7 @@ package org.springframework.guice.module; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; @@ -22,6 +23,14 @@ import java.util.Map; import javax.inject.Provider; +import org.springframework.beans.factory.BeanFactoryUtils; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.util.ClassUtils; + import com.google.inject.AbstractModule; import com.google.inject.Binder; import com.google.inject.Injector; @@ -33,14 +42,6 @@ import com.google.inject.matcher.Matchers; import com.google.inject.name.Names; import com.google.inject.spi.ProvisionListener; -import org.springframework.beans.factory.BeanFactoryUtils; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.beans.factory.support.AbstractBeanDefinition; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.util.ClassUtils; - /** * @author Dave Syer * @@ -127,6 +128,14 @@ public class SpringModule extends AbstractModule { if (type.getTypeName().startsWith("com.google.inject")) { return; } + if (type instanceof ParameterizedType) { + ParameterizedType param = (ParameterizedType) type; + for (Type t : param.getActualTypeArguments()) { + if (!ClassUtils.isPresent(t.getTypeName(), null)) { + return; + } + } + } if (this.bound.get(type) == null) { // Only bind one provider for each type diff --git a/src/test/java/org/springframework/guice/annotation/GuiceModuleAnnotationGenericTypeTests.java b/src/test/java/org/springframework/guice/annotation/GuiceModuleAnnotationGenericTypeTests.java new file mode 100644 index 0000000..c840701 --- /dev/null +++ b/src/test/java/org/springframework/guice/annotation/GuiceModuleAnnotationGenericTypeTests.java @@ -0,0 +1,58 @@ +/* + * Copyright 2013-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package org.springframework.guice.annotation; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +public class GuiceModuleAnnotationGenericTypeTests { + + public interface Foo { + T getValue(); + } + + public static class FooImpl implements Foo { + private final T payload; + + FooImpl(T payload) { + this.payload = payload; + } + + @Override + public T getValue() { + return payload; + } + } + + @Configuration + @EnableGuiceModules + @GuiceModule + static class TestConfig { + @Bean + public FooImpl fooBean() { + return new FooImpl("foo.foo.foo"); + } + } + + @Test + public void testBinding() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class); + assertNotNull(context.getBean(Foo.class)); + context.close(); + } +} \ No newline at end of file