2009-07-31 8 views
7

J'essaie d'utiliser Spring et wx-xmlrpc ensemble. Le problème est que XmlRpcClient a une méthode setConfig() qui ne suit pas la spécification Java Bean: le setter et le getter n'utilisent pas la même classe. Donc, les plaintes printemps quand j'ai le context.xml suivant:Comment utiliser Spring pour injecter un objet dans un setter qui ne suit pas la spécification du bean Java?

<bean id="xmlRpcClient" class="org.apache.xmlrpc.client.XmlRpcClient"> 
    <property name="config"> 
     <bean class="org.apache.xmlrpc.client.XmlRpcClientConfigImpl"> 
      <property name="serverURL" value="http://example.net" /> 
     </bean> 
    </property> 
</bean> 

Il dit: la propriété Bean « config » est pas accessible en écriture ou a une méthode setter non valide. Le type de paramètre du setter correspond-il au type de retour du getter?

Existe-t-il un moyen de surcharger cela? Je sais que je pourrais écrire une usine spécifique pour ce haricot, mais il me semble que ce n'est pas la dernière fois que je trouve ce genre de problème. Je travaille beaucoup avec un code hérité de qualité douteuse ... Etre capable d'utiliser la configuration Spring XML avec ça serait une aide précieuse!

Répondre

9

Écrivez un FactoryBean pour cette classe et demandez-lui d'appeler le setter correct.

+0

Pas vraiment la réponse que je voudrais avoir, mais comme il semble que je ne peux pas faire ce que je veux en XML, un FactoryBean est la solution de contournement la plus propre. – Guillaume

+1

FactoryBeans est là pour vous permettre d'intégrer des éléments non-beans dans Spring. Ce n'est pas une solution de contournement, c'est la solution prévue. – skaffman

+0

Toutes vos entrées de bean en XML sont finalement utilisées pour créer un BeanFactory concret. –

2

Je ne pense pas qu'il existe un moyen de remplacer cela en utilisant la configuration Spring XML. Une alternative à l'utilisation d'une fabrique pourrait être de créer une sous-classe de XmlRpcClient ayant un getter et un setter correspondants pour XmlRpcClientConfig (par exemple setClientConfig/getClientConfig). setClientConfig appelle simplement super.setConfig.

Questions connexes