2009-09-02 21 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

相关问题