2009-09-02 71 views
0

我正在開發可以對通過Hibernate返回的具體數據bean進行操作的功能,或者使用Jakarta Commons/BeanUtils的RowSetDynaClass(它包裝JDBC結果集)返回的DynaBeans。 。 RowSetDynaClass默認強制所有bean屬性名稱爲小寫,我需要使用WrapDynaBean將所有具體bean從Hibernate轉換爲DynaBeans。 RowSetDynaClass的默認下殼似乎是一個好主意,但我可能不知道如何將混凝土bean的屬性名稱包含在內;由於Hibernate的配置,它們不需要與它們相應的表列名稱一致。需要簡單的方法來強制所有DynaBean屬性名稱爲小寫

是否有內置功能強制使用BeanUtils屬性名稱爲小寫?除了RowSetDynaClass之外,我找不到它。代替BeanUtils內置的東西,任何人都可以建議自己實現這個目標的最佳方式嗎?

回答

1

這裏有一個快速/骯髒的方法,我在同時設計用於將DynaBeans到其中(string)鍵名被強制成小寫地圖:

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; 
} 

可惜這迫使我跳通過其他籃球。雖然我已經正是如此處理豆:

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 

現在我以這種方式這樣做:

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

我不知道一個簡單的方法。潛在的你可以讓你自己實現Resolver接口。

但除此之外,我會建議使用一些其他轉換框架,如Smooks(http://www.smooks.org/)或推土機(http://dozer.sourceforge.net)。

推土機能夠爲屬性指定通配符匹配。 Smooks更加面向轉換,因此,您必須明確指定所有字段映射。

雖然它們都有IDE插件,但它們可以幫助您更輕鬆地以更可控的方式生成映像。

+0

知道推土機而不是Smooks的,但我沒有引進權威新的圖書館,我的上級都去了假期,他們昨天想要它;)我會發布我已經設計的答案/解決方案,而不會偏離BeanUtils。 – 2009-09-03 15:07:11

+0

只是一個建議:你可能可以發佈你的解決方案作爲問題的答案,但不能作爲對問題的編輯:) – 2009-09-03 15:52:04

+0

嗯,我通常發佈我的解決方案作爲我自己的問題作爲答案之前,但我衝突,因爲那麼看起來我只是「碰撞」了我的問題。所以我這次做了編輯。 – 2009-09-03 15:55:19

相關問題