Add a test for generic bean type

Fixes gh-26
This commit is contained in:
Dave Syer
2018-02-01 09:03:45 +00:00
parent a6c6f6d182
commit 8e26ec0f3c
3 changed files with 78 additions and 9 deletions

4
.gitignore vendored
View File

@@ -11,8 +11,10 @@ target/
.DS_Store
.settings/
.springBeans
.sts4-cache/
.vscode/
*.iml
*.iws
*.ipr
.idea/
credentials.yml
credentials.yml

View File

@@ -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

View File

@@ -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> {
T getValue();
}
public static class FooImpl<T> implements Foo<T> {
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<String> fooBean() {
return new FooImpl<String>("foo.foo.foo");
}
}
@Test
public void testBinding() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
assertNotNull(context.getBean(Foo.class));
context.close();
}
}