Définition du bean printemps à l'aide d'une classe avec des paramètres génériques
Question
Si j'ai une classe qui ressemble à ceci:
public class MyClass<T extends Enum<T>> {
public void setFoo(T[] foos) {
....
}
}
Comment pourrais-je déclarer cela comme un haricot dans mon contexte xml afin de pouvoir définir le tableau Foo en supposant que je sache ce que T va être (dans mon exemple, disons que T est une énumération avec les valeurs ONE et DEUX)?
Pour le moment, avoir quelque chose comme ça ne suffit pas à dire au printemps ce qu'est le type T:
<bean id="myClass" class="example.MyClass">
<property name="foo">
<list>
<value>ONE</value>
<value>TWO</value>
</list>
</property>
</bean>
Modifier: vous avez oublié la balise de liste.
La solution
Spring n'a pas de support générique pour ce cas, mais le compilateur crée simplement un cast de classe dans ce cas. La bonne solution est donc:
<bean id="myClass" class="example.MyClass">
<property name="foo">
<list value-type="example.MyEnumType">
<value>ONE</value>
<value>TWO</value>
</list>
</property>
</bean>
Autres conseils
Considérez l'exemple de travail.
<bean id="simpleInt"
class="org.nipr.gateway.service.transaction_assistant.GenericSimple">
<constructor-arg>
<!-- this can be any full path to a class -->
<value>java.lang.Integer</value>
</constructor-arg>
</bean>
et
<bean id="simpleString"
class="org.nipr.gateway.service.transaction_assistant.GenericSimple">
<constructor-arg>
<value>java.lang.String</value>
</constructor-arg>
</bean>
Classe générique simple:
public class GenericSimple<T> {
private Class<T> type;
public GenericSimple(Class<T> type) {
this.type = type;
}
public T get( T t) {
return t;
}
}
Et enfin, la méthode de test (en usine):
public void testGeneric(){
Factory factory = new Factory(new String[]{"config/beanForGenericTest.xml"});
GenericSimple<Integer> simpleInt
= (GenericSimple<Integer>)factory.getClass("simpleInt");
System.out.println(simpleInt.get(Integer.valueOf(100)));
Assert.assertTrue(simpleInt.get(Integer.valueOf(100)).equals(100));
GenericSimple<String> simpleString =
(GenericSimple<String>)factory.getClass("simpleString");
System.out.println(simpleString.get(new String("Rockets go fast.")));
Assert.assertTrue(simpleString.get("Rockets go fast.")
.equals("Rockets go fast."));
}
<bean id="myClass" class="example.MyClass">
<property name="foo">
<list>
<value>ONE</value>
<value>TWO</value>
</list>
</property>
</bean>
Vous pouvez également définir un éditeur personnalisé .