需要简单的方法强制所有DynaBean属性名称为小写

时间:2009-09-02 20:22:13

标签: java hibernate apache-commons-beanutils

我正在开发可以对通过Hibernate返回的具体数据bean进行操作的功能,或者使用Jakarta Commons / BeanUtils的RowSetDynaClass(包装JDBC结果集)返回的DynaBeans。默认情况下,RowSetDynaClass强制所有bean属性名称为小写,我需要使用WrapDynaBean将我的所有具体bean从Hibernate转换为DynaBeans。 RowSetDynaClass的默认下限似乎是一个好主意,但是我可能不知道具体bean的属性名称将如何被提示;由于Hibernate配置,它们不需要与它们对应的表列名相同。

是否内置了使用BeanUtils强制属性名称小写的功能?除了RowSetDynaClass之外,我找不到它的文档。代替BeanUtils内置的东西,任何人都可以建议自己实现这一目标的最好方法吗?

2 个答案:

答案 0 :(得分:1)

我不知道这样做的简单方法。 Potentialy你可以自己实现Resolver接口。

但我会建议使用其他转换框架,如Smooks(http://www.smooks.org/)或Dozer(http://dozer.sourceforge.net)。

Dozer能够为属性指定通配符匹配。 Smooks更加面向转换,因此,您必须明确指定所有字段映射。

虽然它们都有IDE插件,但这可能有助于更容易地以更加可控的方式生成mappnigs。

答案 1 :(得分:1)

在此期间,我设计了一个快速/脏的方法,用于将DynaBeans转换为一个Map,其中(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();