2017-08-23 2 views
2

ich generische Typen in einer FactoryBean im Frühjahr Version 4.3.6 zu lösen versuchen. Ich erstelle die Beans mit einer FactoryBean, mit der beliebig viele Instanzen von CarClient erstellt werden können.Frühling Auto Verdrahtung zu gattungsgemäßen Art nicht in der Lage, wenn FactoryBean mit Instanzen der gattungsgemäßen Art zu schaffen

public class CarFactoryBean<T> implements FactoryBean<CarClient<T>>{ 

    @Autowired 
    CarClientCreationHelper cch; 

    private Class<T> type; 

    @Overrides 
    public CarClient<T> getObject() throws Exception { 
     return cch.provideCar(type); 
    } 

    @Override 
    public Class<?> getObjectType() { 
     ResolvableType resolvableType = ResolvableType.forClassWithGenerics(CarClient.class, type); 
     return resolvableType.resolve(); 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 

    public void setType(Class<T> type) { 
     this.type = type; 
    } 
} 

ich diese Bohnen bin Registrierung wie folgt,

public class CarClientRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware { 

    private MyBeanNameGenerator bng; 

    public CarClientRegistrar(){ 
     this.bng = new MyBeanNameGenerator(); 
    } 


    @Override 
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { 
     //logic to obtain serviceInterface, working correctly 

     AbstractBeanDefinition definition = BeanDefinitionBuilder.genericBeanDefinition(CarFactoryBean.class) 
      .addPropertyValue("type", serviceInterface)  
      .getBeanDefinition(); 

     definition.setDescription("desc"); 

     final String beanName = bng.generateBeanName(definition, registry); 
     BeanDefinitionReaderUtils.registerBeanDefinition(new BeanDefinitionHolder(definition, beanName, 
      new String[]{beanName.substring(0, beanName.lastIndexOf("/"))}), registry); 

    } 
} 

Schließlich bin ich die CarClientRegistrar im AppConfig Import

@Import({CarClientRegistrar.class}) 
public class ApplicationConfig { 

} 

und autowiring eine CarClient,

@RestController 
    @RequestMapping(value = "blah") 
    public class CallsController { 
     private CarClient<Ford> fb; 

     @Autowired 
     public CallsController(CarClient<Ford> fordBean){ 
      this.fb = fordBean; 
     } 
    } 

Ich bekomme th e folgende Ausnahme,

Unbefriedigend Abhängigkeit ausgedrückt durch Konstruktorparameter 1; verschachtelte Ausnahme ist org.springframework.beans.factory.NoUniqueBeanDefinitionException: Keine Warte Bohnen vom Typ ‚com.empire.client.CarClient‘ zur Verfügung: Einzel passende Bohne erwartet, aber gefunden 2: car1Impl, car2Impl

Wenn ich jedoch umbenannt, fordBean zu car1Impl (die die erforderliche Bohne ist), es funktioniert

@Autowired 
    public CallsController(CarClient<Ford> car1Impl){ 
     this.fb = fordBean; 
    } 

Irgendwelche Ideen, wie die Gattung der FactoryBean zu lösen, ohne je nach Bean-Namen (aber nach Typ)?

ResolvableType resolvableType = ResolvableType.forClassWithGenerics(CarClient.class, type); 
     return resolvableType.resolve(); 

scheint nicht zu funktionieren.

Vielen Dank im Voraus!

+0

Ich denke, es ist sinnvoll, Informationen über sie in diesem Beitrag: https://stackoverflow.com/questions/22603291/how-to-autowire-bean-of-generic -Typ-im-Frühling –

Antwort

1

Ich löste dies, indem ich den Typ im CarClientRegistrar auflöste und ihn BeanDefinition als Zieltyp zuwies.

ResolvableType resolvableType = ResolvableType.forClassWithGenerics(AsyncClient.class, serviceInterface); 

RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(); 
rootBeanDefinition.setTargetType(resolvableType); 
rootBeanDefinition.setBeanClass(CarFactoryBean.class); 
rootBeanDefinition.getPropertyValues().add("type", serviceInterface); 
rootBeanDefinition.setDescription("desc"); 

anstelle der Verwendung eines GenericBeanDefinition

Verwandte Themen