如何使用 Spring 4 自动装配通用 class?
How to Autowire generic class using Spring 4?
我有如下 class :
class Foo<KeyType, ValueType> {
private Producer<KeyType, ValueType> kafkaProducer;
public Foo() {
this.kafkaProducer = new Producer<KeyType, ValueType>(new ProducerConfig());
}
}
还有另一个 DAO class 使用这个 Foo class,如下所示:
class CompanyDao {
@Autowired
private Foo<String, Integer> fooHelper;
}
我希望 Spring 在 fooHelpder
对象中注入 Foo
类型的对象。为此,我使用以下 XML 配置:
<bean id="fooHelper" class="com.ask.util.Foo">
<property name="KeyType" value="java.lang.String" />
<property name="ValueType" value="Integer" />
</bean>
<bean id="CompanyDao" class="com.ask.dao.CompanyDao">
<property name="fooHelper"><ref bean="fooHelder"/></property>
</bean>
当我使用此 XML 配置时,Spring 抛出以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fooHelper' defined in class path resource [applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'KeyType' of bean class [com.ask.util.fooHelper]: Bean property 'KeyType' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
知道如何解决这个错误吗?
需要进行两项更改。
第一个因为 Spring 4 现在在注入期间使用泛型(Spring 4 之前的版本忽略泛型):
class CompanyDao {
private Foo<KeyType, ValueType> fooHelper;
}
(使用XML配置时不需要注解)
和
<bean id="fooHelper" class="com.ask.util.Foo">
</bean>
<bean id="CompanyDao" class="com.ask.dao.CompanyDao">
<property name="fooHelper"><ref bean="fooHelder"/></property>
</bean>
使用 setter 方法将 KeyType 和 ValueType 属性添加到您的 class。
我有如下 class :
class Foo<KeyType, ValueType> {
private Producer<KeyType, ValueType> kafkaProducer;
public Foo() {
this.kafkaProducer = new Producer<KeyType, ValueType>(new ProducerConfig());
}
}
还有另一个 DAO class 使用这个 Foo class,如下所示:
class CompanyDao {
@Autowired
private Foo<String, Integer> fooHelper;
}
我希望 Spring 在 fooHelpder
对象中注入 Foo
类型的对象。为此,我使用以下 XML 配置:
<bean id="fooHelper" class="com.ask.util.Foo">
<property name="KeyType" value="java.lang.String" />
<property name="ValueType" value="Integer" />
</bean>
<bean id="CompanyDao" class="com.ask.dao.CompanyDao">
<property name="fooHelper"><ref bean="fooHelder"/></property>
</bean>
当我使用此 XML 配置时,Spring 抛出以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fooHelper' defined in class path resource [applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'KeyType' of bean class [com.ask.util.fooHelper]: Bean property 'KeyType' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
知道如何解决这个错误吗?
需要进行两项更改。
第一个因为 Spring 4 现在在注入期间使用泛型(Spring 4 之前的版本忽略泛型):
class CompanyDao {
private Foo<KeyType, ValueType> fooHelper;
}
(使用XML配置时不需要注解)
和
<bean id="fooHelper" class="com.ask.util.Foo">
</bean>
<bean id="CompanyDao" class="com.ask.dao.CompanyDao">
<property name="fooHelper"><ref bean="fooHelder"/></property>
</bean>
使用 setter 方法将 KeyType 和 ValueType 属性添加到您的 class。