2009-08-25 17 views
1

J'utilise la méthode setProperty d'Apache BeanUtils pour importer des données d'un fichier Excel de manière générique. Je fournis à l'analyseur une liste de paires "nom de colum" et "nom de propriété" puis l'analyseur définit les propriétés avec setProperty (..., "nom de propriété", ...) pour les champs Excel qui correspondent à "nom de colonne ". Cela fonctionne bien mais maintenant j'ai un problème, j'ai une propriété qui est définie avec une méthode addXXX() et je ne peux pas changer cette classe. Comment puis-je définir cette propriété sans modifier cette classe ou l'analyseur? Est-ce possible? Puis-je créer quelque chose comme un wrapper avec DynaClass, PropertyUtils ou MethodUtils, donc lors de la définition de cette propriété, il appelle la méthode addXX?BeanUtils avec une méthode addXX

Merci!

Répondre

0

Vous pouvez écrire une classe de bean décorateur qui entourera votre classe et fournira une méthode setXXX() déléguant à addXXX() du bean enveloppé. Vous pouvez même le faire via proxy dynamique à l'aide de cglib ou de toute autre bibliothèque d'instrumentation bytecode.

Si vous préférez utiliser la méthode DynaClass, jetez un coup d'œil au WrapDynaClass. Vous devrez l'étendre pour fournir PropertyDescriptor personnalisé pour votre méthode. Je ne ferais pas cela, cependant, pour deux raisons - premièrement, la sémantique de addXXX() est probablement très différente de setXXX(); et d'autre part, toute l'API interne de DynaClass/DynaBean est un peu désordonnée alors que l'écriture de votre propre classe de décorateur est très simple.

+0

Oui, pourquoi utiliser WrapDynaClass lorsqu'un simple décorateur résout le problème. Merci! – fmaste

+0

J'ai fait le docerator mais maintenant je reçois une exception java.lang.InstantiationException lors de la création de l'instance comme je l'ai fait auparavant. Quelqu'un sait pourquoi? – fmaste

+0

'InstantiationException' est levée lorsque la classe est soit abstraite soit une interface ou qu'elle n'a pas de constructeur sans argument public (ou autrement accessible à l'appelant). Votre problème est probablement le dernier. – ChssPly76