首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我需要一种简单的方法来强制所有DynaBean属性名称为小写

我需要一种简单的方法来强制所有DynaBean属性名称为小写
EN

Stack Overflow用户
提问于 2009-09-02 20:22:13
回答 2查看 2.2K关注 0票数 0

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

是否有使用BeanUtils强制属性名称小写的内置功能?除了RowSetDynaClass之外,我找不到其他的文档。除了内置到BeanUtils中的一些东西之外,有谁能建议我自己实现这一点的最好方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-03 18:36:38

这里有一个我同时设计的快速/粗糙的方法,用于将DynaBeans转换为映射,其中(字符串)键被强制为小写:

代码语言:javascript
运行
复制
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;
}

不幸的是,这迫使我跳过了其他的圈子。鉴于我一直在处理这些豆子:

代码语言:javascript
运行
复制
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

现在我必须这样做:

代码语言:javascript
运行
复制
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();
票数 2
EN

Stack Overflow用户

发布于 2009-09-03 11:32:45

我不知道有什么简单的方法可以做到这一点。你可以自己实现Resolver接口。

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

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

尽管它们都有IDE插件,这可能有助于以更容易和更可控的方式生成mappnigs。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1369915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档