0

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

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

4

2 回答 2

2

这是我同时设计的一种快速/肮脏的方法,用于将 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();
于 2009-09-03T18:36:37.877 回答
1

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

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

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

不过,它们都有 IDE 插件,这可能有助于更轻松、更可控地生成 mappnig。

于 2009-09-03T11:32:44.710 回答