2009-09-02 4 views
0

Je développe des fonctionnalités qui peuvent fonctionner sur des beans de données concrets retournés via Hibernate, ou DynaBeans retournés en utilisant RowSetDynaClass de Jakarta Commons/BeanUtils (qui enveloppe un ensemble de résultats JDBC) . RowSetDynaClass force par défaut tous les noms de propriétés de bean en minuscules, et j'ai besoin de convertir tous mes beans concrets d'Hibernate en DynaBeans en utilisant WrapDynaBean. La casse inférieure par défaut de RowSetDynaClass semble être une bonne idée, mais je ne sais pas à l'avance comment les noms de propriétés des haricots en béton seront placés; En raison de la configuration Hibernate, ils n'ont pas besoin d'être codés de manière identique à leurs noms de colonnes de tables correspondants.Besoin d'un moyen facile de forcer tous les noms de propriété DynaBean en minuscules

Y a-t-il une fonctionnalité intégrée pour forcer les noms de propriétés à utiliser des minuscules en utilisant BeanUtils? Je ne peux pas le trouver documenté autrement que pour RowSetDynaClass. Au lieu de quelque chose intégré à BeanUtils, quelqu'un peut-il suggérer la meilleure façon d'y parvenir moi-même?

Répondre

1

Voici une méthode rapide/sale que j'ai conçu en attendant pour convertir les DynaBeans à une carte où les (String) touches sont sous la contrainte en minuscules:

private Map asLowerCaseIndexedMap(DynaBean bean) { 
    Map lowerCaseIndexedMap = new HashMap(); 
    DynaProperty[] dynaProperties = bean.getDynaClass().getDynaProperties(); 

    for (int i=0, n=dynaProperties.length; i<n; i++) { 
     String propertyName = dynaProperties[i].getName(); 
     lowerCaseIndexedMap.put(propertyName.toLowerCase(), bean.get(propertyName)); 
    } 

    return lowerCaseIndexedMap; 
} 

Malheureusement, cela m'a forcé à sauter à travers d'autres cerceaux. Alors que j'avais traité les haricots ainsi:

public void header(List<DynaBean> headerColumns) throws WriteException { 
    for (DynaBean column : headerColumns) { 
     int col = (Integer)column.get("columnNumber"); 
     int width = (Integer)column.get("columnWidth"); 

    //etcetera 

Maintenant, je dois le faire de cette manière:

public void header(List<DynaBean> headerColumns) throws WriteException { 
    for (DynaBean column : headerColumns) { 
     /* 
     * RowSetDynaClass returns beans with lower case properties by default 
     * but this is not guaranteed if beans are coming from Hibernate. 
     * 
     * Converting from the bean to a map however loses DynaBeans' inherent 
     * type conversions, which in turn entails the converting back and forth 
     * from String, to BigDecimal, to int as seen below 
     */ 
     Map columnMap = asLowerCaseIndexedMap(column); 

     int col = (new BigDecimal(columnMap.get("columnnbr").toString())).intValue(); 
     int width = (new BigDecimal(columnMap.get("columnwdth").toString())).intValue(); 
1

Je ne suis pas au courant d'un moyen facile de le faire. Potentiel vous pouvez faire votre propre implémentation de l'interface Resolver. Sinon, je suggère d'utiliser un autre cadre de conversion comme Smooks (http://www.smooks.org/) ou Dozer (http://dozer.sourceforge.net). Dozer a la possibilité de spécifier des correspondances génériques pour les propriétés. Smooks est plus orienté transformation, donc, vous devrez spécifier explicitement tous les mappages de champs. Cependant, tous les deux ont des plugins IDE, ce qui peut aider à générer des mappnigs plus facilement et de manière plus contrôlée.

+0

était au courant de Dozer mais pas Smooks mais je n'ai pas le pouvoir d'introduire nouvelles bibliothèques, mes deux supérieurs sont partis pour les vacances, et ils le veulent hier;) Je posterai une réponse/solution que j'ai conçue sans m'éloigner de BeanUtils. –

+0

Juste une suggestion: vous pourriez probablement publier votre solution comme une réponse à la question, mais pas comme une modification à la question :) –

+0

Eh bien, j'ai habituellement publié mes solutions à mes propres questions comme réponses avant, mais je suis en conflit parce que alors il pourrait sembler que je ne fais que «bousculer» ma question. Donc je l'ai fait en édition cette fois. –

Questions connexes