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!
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 –